7

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

假设我有一个咖喱函数:

def withThis(n:Int)(op:Int=>Unit){
      println("Before")
      op(n);
      println("After")
}

当我在特殊的 curly-syntax 中使用一个参数调用它时,它按预期工作:

withThis(5){
   (x) => {println("Hello!"); println(x); }
}
// Outputs
Before
Hello!
5
After

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

withThis(5){
     println("Hello!")
     println(_)
}
// Outputs
Hello!
Before
5
After

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

4

2 回答 2

10

您的最后一个代码示例应重写如下以产生预期的结果:

withThis(5) { x =>
     println("Hello!")
     println(x)
}

否则,您的示例等效于

withThis(5) {
     println("Hello!")
     (x: Int) => println(x)
}

因为占位符_将扩展为以非退化方式尽可能紧密地绑定(即,它不会扩展为println(x => x))。

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

于 2011-04-28T18:23:52.623 回答
3

在您的第二个示例中, curlies: 中的部分{ println("Hello!"); println(_) }是一个打印“Hello!”的块 并返回一个咖喱println​​。想象一下它被简化为{ println("Hello!"); 5 },一个打印“Hello!”的块。并返回 5。

于 2011-04-28T17:59:11.347 回答