2012-08-16 82 views
3

是否有這兩種定義接受 「SSS」 作爲參數下面斯卡拉 - 類型T的參數或=> T

def foo(s: String) = { ... } 

def foo(s: => String) { ... } 

之間的任何差異。

+3

第一道,這可能是對你有意思:HTTP://計算器.com/a/4545703/298389 – 2012-08-16 17:18:26

+0

你是否想在兩個函數的大括號之前加'='符號?下面的答案假設了這一點。它有一個重要的區別,但將是一個單獨的討論。 – 2012-08-17 07:13:53

回答

17

參數Stringby-value參數,=> Stringby-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) 
2

在許多情況下,它們是相同的,但

的=>經過名

按值

+1

=>意思是「按名稱」而不是「通過參考」 – 2012-08-16 21:23:50

+0

抱歉,我只是編輯了答案。我剛剛回答了關於通過價值/參考傳遞的另一個問題,並將其放在我的頭上。 – jcern 2012-08-16 21:29:19

+0

他們不一樣。他們是兩回事。 – 2012-08-17 00:16:35