以下有什么区别吗
def foo(s: String) = { ... }
和
def foo(s: => String) { ... }
这两个定义都接受“sss”作为参数。
以下有什么区别吗
def foo(s: String) = { ... }
和
def foo(s: => String) { ... }
这两个定义都接受“sss”作为参数。
实参String
是按值参数,=> String
是按名称参数。在第一种情况下,传入字符串,在第二种情况下,传入一个所谓的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)
在许多情况下,它们是相同的,但
=> 按名称传递
第一个按值传递