在scala中按名称调用

时间:2013-10-22 16:46:43

标签: scala

两个greet方法是否相同

object test {
  def greet = { println("hi")}                    //> greet: => Unit
  def greet1(f: => Unit)= {println("hi")}         //> greet1: (f: => Unit)Unit
}

根据我的理解 greet 是一个不带任何参数的函数,返回Unit和参数按名称调用。 greet1 是一个函数,它接受返回Unit的函数,也是一个名称为其参数的调用。 很困惑,任何人都可以解释这种差异。

1 个答案:

答案 0 :(得分:5)

greet是一个返回单位的方法。 在这种特殊情况下,它们在功能上做同样的事情。 greet1接受一个函数返回Unit作为参数,但不使用它。所以你可以把greet1称为:

greet1(greet)

由于greet是通过参数传递的,因此不会应用。但通常他们不是一回事。如果您将greet1更改为以下内容:

def greet1(f: => Unit)= {
  println("hi")
  f()
}

如上所述调用greet1会两次打印“hi”。或

def greet1(f: => Unit)= {
  println("hi")
  f()
  f()
}

将打印“hi”三次。每次调用参数时都会评估参数。如果您要将greet1重写为:

def greet1(f: Unit)= {
  println("hi")
  f
  f
} // and call it:

greet1(greet)

它只会打印“hi”两次,因为参数是按值调用它被评估一次而只被调用一次。