Scala - 类型为T或=的参数; Ť

时间:2012-08-16 17:04:52

标签: scala function-parameter

以下

之间是否有任何区别?
def foo(s: String) = { ... }

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

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

2 个答案:

答案 0 :(得分:18)

参数Stringby-value参数,=> Stringby-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)

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

=>按名称传递

第一个按值传递