奇怪的东西与咖喱功能

And*_*yuk 7 scala currying control-flow

我有这种奇怪的情况,我不明白.我正在阅读"Scala编程"一书,Ch.9.

假设我有一个curried函数:

def withThis(n:Int)(op:Int=>Unit){
      println("Before")
      op(n);
      println("After")
}
Run Code Online (Sandbox Code Playgroud)

当我在一个特殊的卷曲语法中使用一个参数调用它时,它按预期工作:

withThis(5){
   (x) => {println("Hello!"); println(x); }
}
// Outputs
Before
Hello!
5
After
Run Code Online (Sandbox Code Playgroud)

但是,如果我提出两个陈述,我会得到一些奇怪的东西:

withThis(5){
     println("Hello!")
     println(_)
}
// Outputs
Hello!
Before
5
After
Run Code Online (Sandbox Code Playgroud)

怎么来"你好!" 在"之前"之前打印,然后在里面打印"5"?我疯了吗?

Jea*_*let 10

您的上一个代码示例应该按如下方式重写,以产生预期的结果:

withThis(5) { x =>
     println("Hello!")
     println(x)
}
Run Code Online (Sandbox Code Playgroud)

否则,您的示例相当于

withThis(5) {
     println("Hello!")
     (x: Int) => println(x)
}
Run Code Online (Sandbox Code Playgroud)

因为占位符_将被扩展为以非简并的方式尽可能紧密地绑定(即,它不会扩展到println(x => x)).

另一件需要注意的是,块总是返回其最后一个值.在您的示例中,最后一个值实际上是(x: Int) => println(x).

  • 但println(x => x)甚至不是正确的语法.无论如何 - 我理解println(_)的作用 - 我对这个"块"业务更加困惑. (2认同)