5

以下有什么区别吗

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

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

这两个定义都接受“sss”作为参数。

4

2 回答 2

19

实参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)
于 2012-08-16T17:19:25.537 回答
2

在许多情况下,它们是相同的,但

=> 按名称传递

第一个按值传递

于 2012-08-16T17:20:01.317 回答