Scala:参数的(a:String)和(a:=> String)有什么区别?

时间:2015-03-27 17:08:20

标签: scala

这两种方法有什么区别?

def method1(msg: => String) = print(msg)
def method2(msg: String) = print(msg)

我可以调用它们。

  method1("1")
  method2("2") 

他们打印12

2 个答案:

答案 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)是按名称方法调用。

在按名称调用时,在使用参数之前不会对其进行评估,并且每次使用时也会对其进行重新评估。

在按值调用时,将在函数调用时计算参数。