這是一個無參數的函數返回一個String
:
() => String
這是不是你有什麼。 這,
=> <WHATEVER>
是通過名字,而不是按值被傳遞的參數。例如:
=> String // A string being passed by-name
=>() => String // A parameterless function returning string being passed by-name
這些模式之間的差別在於,在由值,該參數是評價和值被傳遞,而在按名稱,參數被傳遞「所得到的是「,並在每次使用時進行評估。
例如:
var x = 0
def printValue(y: Int) = println(s"I got $y. Repeating: $y.")
def printName(y: => Int) = println(s"I got $y. Repeating: $y.")
printValue { x += 1; x } // I got 1. Repeating: 1.
printName { x += 1; x } // I got 2. Repeating: 3.
現在,至於爲什麼該方法是分割成第二個參數,它只是一個語法愉快的事情。例如,採用類似定義的方法foldLeft
。你可以寫這樣的事情:
(1 to 10).foldLeft(0) { (acc, x) =>
println(s"Accumulator: $acc\tx: $x\tacc+x: ${acc+x}")
acc+x
}
如果foldLeft
被定義爲一個單一的參數列表,它應該是這樣的:
(1 to 10).foldLeft(0, { (acc, x) =>
println(s"Accumulator: $acc\tx: $x\tacc+x: ${acc+x}")
acc+x
})
沒有太大的不同,理所當然,但更糟糕的期待。我的意思是,你不會在下面寫這個東西,是嗎?
if (x == y, {
println("Same thing")
}, {
println("Different thing"
})
拆分參數到2只列出了允許在某些特定情況下,類型推斷:http://stackoverflow.com/questions/13868085/ – Infinity
'default'是一個「調用 - 名」參數。它是懶惰的功能評估(或根本不需要)。 – Ryan
人們喜歡的語法:'f(a,b){val s =「hi」; s}'。 http://www.artima.com/pins1ed/control-abstraction.html#9.4 –