나는 이해할 수없는 이상한 상황에 처해있다. 저는 "Programming in Scala"책을 읽고 있습니다, Ch. 9.카레 기능이 이상한 물건
의이 나는 카레 기능을 가지고 있다고 가정 해 봅시다 : 나는 경우,
withThis(5){
(x) => {println("Hello!"); println(x); }
}
// Outputs
Before
Hello!
5
After
그러나 : 내가 예상했던대로 작동 특별한 곱슬 구문 내에서 하나 개의 인자로 호출
def withThis(n:Int)(op:Int=>Unit){
println("Before")
op(n);
println("After")
}
두 문장을 넣어, 나는 뭔가 wierd를 얻을 :
withThis(5){
println("Hello!")
println(_)
}
// Outputs
Hello!
Before
5
After
어떻게 "와서!" "Before"와 "5"가 인쇄되기 전에 인쇄됩니까? 내가 미쳤 니?
하지만 println (x => x)은 올바른 구문이 아닙니다. 어쨌든 - 나는 println (_)이하는 일을 이해합니다 - 저는이 "블록"사업에 대해 더 혼란 스러웠습니다. – drozzy
구문이 정확합니다. 이 경우에는 매개 변수 유형이 없어서 컴파일되지 않지만 컴파일러에서 유추 할 수있는 경우에는 작동합니다. 간단한 예 :'def doit (f : Int => Int) =(); doit (x => x)' –
나는 그것이 "(x : Int) => println (x)"과 동등하다는 것을 안다. 나의 질문은 실제로 println을 먼저 실행하는 이유이다. "블록은 항상 마지막 값을 반환합니다"라고 대답 한 것 같습니다. 블록이 느슨하게 평가되지 않는다는 것을 의미합니까? – drozzy