0

两种问候方法是否相同

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

据我了解, greet是一个不接受任何参数并返回 Unit 的函数,并且参数是按名称调用的。greet1是一个函数,它接受返回 Unit 的函数,并且也是对其参数的名称调用很困惑,谁能解释一下区别。

4

1 回答 1

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”,因为参数是按值调用的,它被评估一次并且在调用时只评估一次。

于 2013-10-22T17:20:42.593 回答