我有这种奇怪的情况,我不明白。我正在阅读“Scala编程”一书。 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”?我疯了吗?
但是println(x => x)甚至不是正确的语法。无论如何 - 我明白println(_)的作用 - 对于这个“块”业务,我更加困惑。 – drozzy 2011-04-28 18:34:20
语法正确。在这种情况下,它不会编译,因为缺少参数类型,但如果编译器可以推断它,则会起作用。简单的例子:'def doit(f:Int => Int)=(); doit(x => x)' – 2011-04-28 18:37:36
我知道它相当于“(x:Int)=> println(x)”,我的问题是为什么它实际上首先执行println。我想你回答“块总是返回最后一个值”。这是否意味着块不会被懒惰评估? – drozzy 2011-05-02 16:55:24