1

假设我们这样做

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

为什么与命名函数具有相同类型签名的匿名函数需要显式的空参数?为什么biggie打印时调用但2pac函数不调用?

4

1 回答 1

11

让我们逐行进行:

println(() => "2pac")

在这里,您将一个函数传递给 println。记住 Scala 中的函数只是一个对象,所以 println 只是调用类型toString上的方法Function0,它总是输出<function>(实际上对我来说它输出<function0>

println((() => "shakur")())

现在您在将 anon 函数传递给 之前调用它println,因此它不是接收Function0对象,而是接收函数的返回值并输出字符串

println(biggie)

最后,这里biggie不仅仅是 a Function0,它是一个函数,这意味着该函数在被引用时执行,并且不需要显式调用()。这是因为您在没有参数列表的情况下定义了它,而不是空参数列表。因此,当您调用 时println(biggie),会评估该biggie函数并将其结果发送到println

如果你调用println(biggie _),下划线告诉编译器不要评估函数,而是将函数本身传递给println。同样,如果您定义biggie为:

def biggie() = "smalls"

当您调用println(biggie)它时,其行为与传递 0-arg anon 函数相同。

于 2013-03-04T22:27:50.343 回答