[SCALA] 스칼라의 인수로 여러 줄 함수 리터럴
SCALA스칼라의 인수로 여러 줄 함수 리터럴
나는 항상 우리가 여러 문장에 대해서도 중괄호를 무시할 수없는 이유 때때로 함수 리터럴 궁금. 이를 설명하기 위해, 여러 줄 함수 리터럴의 구문은 중괄호로 문을 둘러싸입니다. 같은,
val fl = (x: Int) => {
println("Add 25 to "+x)
x + 25
}
그러나, 당신은 하나의 인수 함수에 통과 할 때, 당신은 함수 리터럴에 필요한 중괄호를 무시할 수 있습니다.
따라서 소정의 함수 f에 대한,
def f( fl: Int => Int ) {
println("Result is "+ fl(5))
}
당신은이 같은 F ()를 호출 할 수 있습니다
f( x=> {
println("Add 25 to "+x)
x + 25
})
-------------------------
Add 25 to 5
Result: 30
당신은 함수 호출에 괄호 대신 중괄호를 사용하는 경우 또는, 당신은 함수 리터럴에서 내부 중괄호를 제거 할 수 있습니다. 다음 코드 그래서 것이다 또한 작업,
f{ x=>
println("Add 25 to "+x)
x + 25
}
위의 코드는 더 읽기와 나는 많은 예제는이 구문을 사용하는 것을 알 수 있습니다. 그러나, 나는 놓친 수 있다는 특별한 규칙이 의도 노력으로 이유를 설명 할 수 있는가?
해결법
-
==============================
1.간단한 문법 규칙의 단지 몇 가지 있습니다. 스펙의 부록 가치를 숙독입니다.
간단한 문법 규칙의 단지 몇 가지 있습니다. 스펙의 부록 가치를 숙독입니다.
함수 리터럴 또는 익명 함수 (6.23)의 각각의 컨텍스트는 EXPR 또는 ResultExpr인지에 따라 X => EXPR 또는 X => 차단 같을 것이다.
기능 프로그램 (6.6), 즉 F (EXPR, EXPR)처럼 또는 BlockExpr f를 보이는 것, F {} 블록. 즉하는 BlockExpr는 {...} 내부 블록 일련의 문장이다.
만약 F (g)를 호출 할 때, g 정도로 함수 리터럴, X => EXPR 같이 expr이있다. expr의 BlockExpr가 될 수 X => {...}.
당신이 {차단} f를 호출 할 때, f를 {X => ...} 블록의 ResultExpr에서 함수 리터럴이 (단지 문장의 순서이며, 더 중괄호는 필요 없음).
여기서,는 익명의 FUNC가 블록의 맨 아래에 있음을 분명 :
scala> def m(x: Int=>Int) = x(5) m: (x: Int => Int)Int scala> m { | val y = 7 | x => // no brace | x+y+1 | } res0: Int = 13
-
==============================
2.이것은 나에게 스칼라 아름다운 만드는 것들 중 하나입니다.
이것은 나에게 스칼라 아름다운 만드는 것들 중 하나입니다.
귀하의 질문에 대한 대답은 간단하다 :
괄호 () 한 줄의 구조에 대한 의미한다. 예를 들어,이 작품 :
def f(fl: Int => Int) { println("Result is " + fl(5)) } f( x => x + 25) f(x => x + 25) // single line
중괄호는 {} 여러 문에 대한 의미가있다. 예를 들어,이 작품 :
f { x => println("Add 25 to " + x) x + 25 }
하지만이 코드는 작동하지 않습니다
f ( x => println("Add 25 to " + x) x + 25 )
컴파일러는 다음 메시지와 함께 불평 :
당신은 세미콜론을 추가하는 경우, 당신은 타의 추종을 불허하는 괄호로 인한 구문 오류가 발생합니다.
이 작업을 수행하려고하면 :
f { x => println("Add 25 to " + x) x + 25 }
컴파일러는 메시지와 함께 당신에게 다시 얻을 것이다 :
value x is not a member of unit
당신은 그가 단위의 구성원으로 X를 찾기 위해 노력하고 있음을받을 수 있나요. 처럼:
f { println("Add 25 to " + x).x.+(25) }
어느 분명히 잘못된 것입니다.
이처럼 내부 중괄호를 추가하는 경우 :
f ( x => { println("Add 25 to " + x) x + 25 } )
이 작품은 것입니다,하지만 당신은 여전히 중괄호의 사용에 의해 신호되는 여러 문이있다. 컴파일러는 당신이 원하는 것을 알 수 있도록이 첫 번째 인쇄하는 것입니다 후 X 25을 추가합니다.
나는 그 미묘한 차이에 의해 전에 물린했습니다. 당신은 코드와 주로지도, flatMaps, foreachs, FORS 및 무두질을 사용할 때이 많이 읽을 것이기 때문에 이후로, 나는 그와 방식 I 코드에 주목했습니다.
건배!
from https://stackoverflow.com/questions/13872196/multiline-function-literal-as-arguments-in-scala by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 스칼라 앞으로 참조 [중복] (0) | 2019.11.09 |
---|---|
[SCALA] 스파크 DataFrame : 해 orderBy 후 GROUPBY 그 질서를 유지 하는가? (0) | 2019.11.09 |
[SCALA] 스칼라 : 암시 적 매개 변수 해상도 우선 순위 (0) | 2019.11.09 |
[SCALA] 어떻게 가변 인자와없는 방법 사이 스칼라에서 명확하게 않는다 (0) | 2019.11.09 |
[SCALA] 소문자 변수 이름 스칼라 패턴 매칭 (0) | 2019.11.09 |