假设我们做了
object Test {
def main(args: Array[String]){
println(() => "2pac") // passing anon function
println((() => "shakur")()) // passing anon function, with empty args
println(biggie) // passing named function, no args
}
def biggie = "smalls"
}
那将打印出来
<function>
shakur
smalls
为什么具有与命名函数相同类型签名的匿名函数需要显式空args?为什么biggie
在打印时被调用但2pac
函数没有?
答案 0 :(得分:11)
让我们一行一行:
println(() => "2pac")
这里你将一个函数传递给println。记住Scala中的函数只是一个对象,所以println只是在toString
类型上调用Function0
方法,它总是输出<function>
(实际上对我来说它输出<function0>
})
println((() => "shakur")())
现在你在将anon函数传递给println
之前调用它,所以它不是接收Function0
对象,而是接收函数的返回值并输出字符串
println(biggie)
最后,biggie
不仅仅是Function0
,它还是 nullary 函数,这意味着只要引用它就会执行该函数,并且不会明确要求调用{{ 1}}。这是因为您在没有参数列表的情况下定义它,而不是空参数列表。因此,当您致电()
时,会评估println(biggie)
函数并将其结果发送至biggie
如果你调用println
,下划线告诉编译器不来评估函数,而是将函数本身传递给println(biggie _)
。同样,如果您将println
定义为:
biggie
当你调用def biggie() = "smalls"
时,它的行为与传递0-arg anon函数相同。