[英]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.