2013-02-28 92 views
2

我是一个scala新手。斯卡拉匿名函数语法

是什么

invokeFunc(() => { "this is a string" }) 

invokeFunc({() => "this is a string" }) 

如果你有一个小的细微差别阶我将不胜感激一个很好的资源之间的差异。

+4

我会说stackoverflow [是这样的资源(向下滚动)](http:// stackoverflow。com/tags/scala/info) – 2013-02-28 10:47:44

+0

哇谢谢,不知道它存在:) – 2013-02-28 10:48:42

回答

10

TL; DR:这两个代码片段是等效的。

() => { "this is a string" }大括号引入代码。由于这段代码只包含一个表达式,所以它本质上是无用的,你可以写成() => "this is a string"

此外,scala几乎总是让您选择是否在调用方法时使用括号或大括号。所以println("hello")println{"hello"}相同。 scala允许使用大括号的原因是,您可以定义可以使用的方法,例如它是该语言的内置部分。举例,你可以定义:

def fromOneToTen(f: Int => Unit) { 
    for (i <- 1 to 10) f(i) 
} 

然后执行:

fromOneToTen{ i => println(i) } 

的花括号这里使它看起来更像是一个控制结构,如Scala的内置while

所以invokeFunc(() => { "this is a string" })相同invokeFunc{() => { "this is a string" } }

作为最后一点,括号总是可以在任何地方围绕单个表达式中使用,所以(5)是一样的5。 花括号始终可用于定义包含一系列表达式的块,该块返回最后一个表达式。这种情况的一个特例是单个表达式的块,在这种情况下,大括号与括号发挥相同的作用。 所有这一切意味着您可以随时在表达式中添加多余的圆括号或大括号。所以以下全部等同:123,{123},(123),({123})等等。

这也意味着:

invokeFunc(() => "this is a string") 

相同

invokeFunc({() => "this is a string" }) 

其是相同

invokeFunc({(() => "this is a string")}) 

等。

6

据我了解,第一个有一个匿名函数,而第二个有一个块。但是,块的最后一个元素在Scala中返回,所以块返回相同的匿名函数,然后该函数成为方法的参数。

+3

TLDR:在这种情况下根本没有任何区别 – 2013-02-28 11:03:37

+2

在这种情况下。但'invokeFunc({println(“heeeey!”);()=>“这是一个字符串”})'也行得通,证明了它的区别。 – pr1001 2013-02-28 11:07:54