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

bar*_*ara 0 scala

这两种方法有什么区别?

def method1(msg: => String) = print(msg)
def method2(msg: String) = print(msg)
Run Code Online (Sandbox Code Playgroud)

我可以调用它们.

  method1("1")
  method2("2") 
Run Code Online (Sandbox Code Playgroud)

他们打印 12

Eug*_*nev 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"})
Run Code Online (Sandbox Code Playgroud)

输出:

Evaluate Arg1
Method1
Evaluate Arg1
Method1
Evaluate Arg2
Method2
Method2
Run Code Online (Sandbox Code Playgroud)

正如您在每次访问msg它时都可以在method1中看到的那样,重新进行了评估

  • 它是另一种方式,在方法调用时按名称值进行调用,这里方法1是按名称调用的,它的值在函数调用时进行计算,方法2是在值调用之前进行的,它将在方法调用之前进行求值. (3认同)