Scala - 类型为T或=> T的参数

Bob*_*r02 4 scala function-parameter

以下是否有任何区别

def foo(s: String) = { ... }
Run Code Online (Sandbox Code Playgroud)

def foo(s: => String) { ... }
Run Code Online (Sandbox Code Playgroud)

这两个定义都接受"sss"作为参数.

0__*_*0__ 18

参数String是一个by-value参数,=> String是一个by-name参数.在第一种情况下,该字符串传递中,在第二所谓的形实转换计算结果为一个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
Run Code Online (Sandbox Code Playgroud)

通常不使用by-name参数多次评估它,而是懒惰地评估它一次.

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)
Run Code Online (Sandbox Code Playgroud)