我是斯卡拉新手。
之间有什么区别
invokeFunc(() => { "this is a string" } )
和
invokeFunc({ () => "this is a string" })
如果你有一个很好的小scala细微差别的资源,我将不胜感激。
答案 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中返回,因此该块返回相同的匿名函数,该函数随后成为方法的参数。