在scala中按名称调用

Abh*_*oor 0 scala

两个问候方法都一样

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是需要函数返回单位,也可以通过名字为它的参数调用的函数.很困惑,任何人都可以善解释这种差异.

Ric*_*ver 5

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"两次,因为参数是按值调用它被评估一次而在被调用时只打印一次.