是否有這兩種定義接受 「SSS」 作爲參數下面斯卡拉 - 類型T的參數或=> T
def foo(s: String) = { ... }
和
def foo(s: => String) { ... }
之間的任何差異。
是否有這兩種定義接受 「SSS」 作爲參數下面斯卡拉 - 類型T的參數或=> T
def foo(s: String) = { ... }
和
def foo(s: => String) { ... }
之間的任何差異。
參數String
是by-value參數,=> String
是by-name參數。在第一種情況下,字符串被傳入,第二種情況是所謂的thunk,其使用時評估爲 a String
。
def stringGen: String = util.Random.nextInt().toString
def byValue(s: String) =
println("We have a '" + s + "' and a '" + s + "'")
def byName(s: => String) =
println("We have a '" + s + "' and a '" + s + "'")
byValue(stringGen) // constant value
byName (stringGen) // evaluated twice
通常一個通過名字參數不用於多次對其進行評估,但懶洋洋地一次評估。
def logMessage = {
println("Calculating log message...")
new java.util.Date().toString
}
def log(enabled: Boolean, message: => String): Unit = {
lazy val fullMessage = "LOG: " + message
println("Test")
if (enabled) println(fullMessage)
}
log(false, logMessage)
log(true , logMessage)
在許多情況下,它們是相同的,但
的=>經過名
按值
=>意思是「按名稱」而不是「通過參考」 – 2012-08-16 21:23:50
抱歉,我只是編輯了答案。我剛剛回答了關於通過價值/參考傳遞的另一個問題,並將其放在我的頭上。 – jcern 2012-08-16 21:29:19
他們不一樣。他們是兩回事。 – 2012-08-17 00:16:35
第一道,這可能是對你有意思:HTTP://計算器.com/a/4545703/298389 – 2012-08-16 17:18:26
你是否想在兩個函數的大括號之前加'='符號?下面的答案假設了這一點。它有一個重要的區別,但將是一個單獨的討論。 – 2012-08-17 07:13:53