这两种方法有什么区别?
def method1(msg: => String) = print(msg)
def method2(msg: String) = print(msg)
我可以调用它们。
method1("1")
method2("2")
他们打印12
答案 0 :(得分:6)
它按名称调用传递参数,当参数按名称传递并在函数内部访问时,它再次进行求值。您可以运行示例代码:
def method1(msg: => String) = {
println(msg)
println(msg)
}
def method2(msg: String) = {
println(msg)
println(msg)
}
method1({println("Evaluate Arg1"); "Method1"})
method2({println("Evaluate Arg2"); "Method2"})
输出:
Evaluate Arg1
Method1
Evaluate Arg1
Method1
Evaluate Arg2
Method2
Method2
正如您在每次访问msg
时都可以在方法1中看到的那样,它会被重新评估
答案 1 :(得分:4)
第二个method2(msg: String)
是按值调用方法,第一个method1(msg: => String)
是按名称方法调用。
在按名称调用时,在使用参数之前不会对其进行评估,并且每次使用时也会对其进行重新评估。
在按值调用时,将在函数调用时计算参数。