繁体   English   中英

在Scala中按名称致电

[英]Call by name in scala

都打招呼方法都一样

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

据我了解, greet是一个不带任何参数并返回Unit和参数的函数。 greet1是一个函数,该函数接受返回Unit的函数,并且也是其名称的名称调用。 感到困惑,有人能解释这个区别吗?

greet是一种返回单位的方法。 在这种特殊情况下,它们在功能上是相同的。 greet1将返回单位的函数作为参数,但不使用它。 因此您可以将greet1称为:

greet1(greet)

并且由于由参数传递的问候语将不会被应用。 但是通常它们不是一回事。 如果将greet1更改为以下内容:

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

如上所述调用greet1将打印两次“ hi”。 要么

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

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

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

greet1(greet)

它只会打印两次“ hi”,因为参数是通过值调用的,它只被计算一次,被调用一次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM