5

次の間に違いはありますか

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

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

これらの定義は両方とも、パラメーターとして「sss」を受け入れます。

4

2 に答える 2

19

引数String値によるパラメーターで=> Stringあり、名前によるパラメーターです。最初のケースでは、文字列が渡され、2番目のケースでは、使用されるたびに評価れるいわゆるサンクが渡されます。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

多くの場合、名前によるパラメーターは、それを数回評価するために使用されるのではなく、 1回怠惰に評価するために使用されます。

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 に答える