我有这种奇怪的情况,我不明白。我正在阅读“Scala编程”一书,Ch。 9。
假设我有一个咖喱功能:
def withThis(n:Int)(op:Int=>Unit){
println("Before")
op(n);
println("After")
}
当我在一个特殊的卷曲语法中用一个参数调用它时,它按预期工作:
withThis(5){
(x) => {println("Hello!"); println(x); }
}
// Outputs
Before
Hello!
5
After
但是,如果我提出两个陈述,我会得到一些奇怪的东西:
withThis(5){
println("Hello!")
println(_)
}
// Outputs
Hello!
Before
5
After
为什么“你好!”在“之前”之前打印,然后在里面打印“5”?我疯了吗?
答案 0 :(得分:10)
您的上一个代码示例应该按如下方式重写,以产生预期的结果:
withThis(5) { x =>
println("Hello!")
println(x)
}
否则,您的示例等同于
withThis(5) {
println("Hello!")
(x: Int) => println(x)
}
因为占位符_
将以非退化的方式扩展为尽可能紧密地绑定(即,它不会扩展为println(x => x)
)。
另一件需要注意的是,块总是返回其最后一个值。在您的示例中,最后一个值实际为(x: Int) => println(x)
。
答案 1 :(得分:3)
在你的第二个例子中,curlies中的部分:{ println("Hello!"); println(_) }
是一个打印“Hello!”的块。并返回一个curry println
。想象一下它被简化为{ println("Hello!"); 5 }
,这是一个打印“Hello!”的块。并返回5.