我有這種奇怪的情況,我不明白。我正在閱讀「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