以下
之间是否有任何区别?def foo(s: String) = { ... }
和
def foo(s: => String) { ... }
这两个定义都接受“sss”作为参数。
答案 0 :(得分:18)
参数String
是by-value参数,=> String
是by-name参数。在第一种情况下,传入字符串,在第二种情况下传递一个所谓的thunk,只要它被使用,就会评估一个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
通常不会使用by-name参数对其进行多次评估,而是 lazily 对其进行一次评估。
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)
答案 1 :(得分:2)
在许多情况下,它们是相同的,但
=>按名称传递
第一个按值传递