Scala匿名函数语法

时间:2013-02-28 10:45:29

标签: scala

我是斯卡拉新手。

之间有什么区别
 invokeFunc(() => { "this is a string" } )

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

如果你有一个很好的小scala细微差别的资源,我将不胜感激。

2 个答案:

答案 0 :(得分: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" )})

等等。

答案 1 :(得分:6)

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