我是一个 Scala 新手。
有什么区别
invokeFunc(() => { "this is a string" } )
和
invokeFunc({ () => "this is a string" })
如果您有关于 scala 细微差别的良好资源,我将不胜感激。
最佳答案
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
相同。
花括号总是可以用来定义一个包含一系列表达式的 block ,该 block 返回最后一个表达式。这种情况的一个特例是单个表达式的 block ,在这种情况下,大括号起着与圆括号相同的作用。
所有这些意味着您始终可以在表达式周围添加多余的圆括号或花括号。所以以下都是等价的:123
、{123}
、(123)
、({123})
等等。
这也意味着:
invokeFunc(() => "this is a string")
与
相同invokeFunc({ () => "this is a string" })
与
相同invokeFunc({( () => "this is a string" )})
等等。
关于Scala 匿名函数语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15133471/