两个greet方法是否相同
object test {
def greet = { println("hi")} //> greet: => Unit
def greet1(f: => Unit)= {println("hi")} //> greet1: (f: => Unit)Unit
}
根据我的理解 greet 是一个不带任何参数的函数,返回Unit和参数按名称调用。 greet1 是一个函数,它接受返回Unit的函数,也是一个名称为其参数的调用。 很困惑,任何人都可以解释这种差异。
答案 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”两次,因为参数是按值调用它被评估一次而只被调用一次。