次の間に違いはありますか
def foo(s: String) = { ... }
と
def foo(s: => String) { ... }
これらの定義は両方とも、パラメーターとして「sss」を受け入れます。
次の間に違いはありますか
def foo(s: String) = { ... }
と
def foo(s: => String) { ... }
これらの定義は両方とも、パラメーターとして「sss」を受け入れます。
引数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)
多くの場合、それらは同じですが
=>名前で渡す
最初の値渡し