Scala中println中的匿名函数

时间:2013-03-04 22:15:49

标签: scala

假设我们做了

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函数没有?

1 个答案:

答案 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函数相同。