2013-03-04 52 views
1

比方说,我们做匿名函数中的println在斯卡拉

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

回答

11

让我们一行一行:

println(() => "2pac") 

这里要传递一个函数给println。请记住,在斯卡拉的功能仅仅是一个对象,所以的println只是呼吁Function0类型,它只是始终输出<function>(其实对我来说,输出<function0>

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

现在要调用的匿名函数toString方法它被传递给println之前,所以不是接收Function0对象时,它接收该函数的返回值,并只输出该串

println(biggie) 

最后,这里biggie不仅仅是Function0,它是一个nopelary函数,意思是函数在被引用时执行,并且不明确要求调用()。这是因为您没有参数列表而是定义它,而不是空的参数列表。所以,当你调用println(biggie),该biggie功能进行评估,如果你打电话println(biggie _)其结果发送到println

,下划线告诉编译器评价功能,而是它传递函数本身println。同样,如果你定义biggie为:

def biggie() = "smalls" 

当你调用println(biggie)它则表现与传递一个0-ARG匿名函数。

+0

谢谢,这清除了事情! – TranquilMarmot 2013-03-04 22:31:49

+0

+1。很好的详细。但是你应该用“空方法”来代替“空功能”。 “方法”和“功能”的概念通常可以互换使用,区别通常并不重要,但在这里它确实:即使(空)参数列表丢失,也不会自动应用空函数,而一个空方法将会(如果在预计除函数以外的某种类型的情况下使用)。 Plus方法区分nullary方法和no-arg方法,而函数只能是nullary(无参数函数不存在于scala中)。 – 2013-03-05 00:39:41

+0

'def's不是函数,它们是方法。 – pedrofurla 2013-03-05 01:57:38