两个问候方法都一样
object test {
def greet = { println("hi")} //> greet: => Unit
def greet1(f: => Unit)= {println("hi")} //> greet1: (f: => Unit)Unit
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解greet是一个函数,它不接受任何参数并返回Unit和参数按名称调用.而greet1是需要函数返回单位,也可以通过名字为它的参数调用的函数.很困惑,任何人都可以善解释这种差异.
greet是一个返回单位的方法.在这种特殊情况下,它们在功能上做同样的事情.greet1接受一个函数返回Unit作为参数,但不使用它.所以你可以把greet1称为:
greet1(greet)
Run Code Online (Sandbox Code Playgroud)
并且由于greet是通过参数传递的,因此不会应用.但通常他们不是一回事.如果您将greet1更改为以下内容:
def greet1(f: => Unit)= {
println("hi")
f()
}
Run Code Online (Sandbox Code Playgroud)
如上所述调用greet1会两次打印"hi".要么
def greet1(f: => Unit)= {
println("hi")
f()
f()
}
Run Code Online (Sandbox Code Playgroud)
将打印"hi"三次.每次调用参数时都会评估参数.如果您要将greet1重写为:
def greet1(f: Unit)= {
println("hi")
f
f
} // and call it:
greet1(greet)
Run Code Online (Sandbox Code Playgroud)
它只会打印"hi"两次,因为参数是按值调用它被评估一次而在被调用时只打印一次.