Scala 匿名函数语法

标签 scala

我是一个 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/

相关文章:

swing - 在 Scala TextArea 中设置字体和大小

scala - Playframework(Scala) : passing user model around

scala - 怎么把Elastic4s的GetResponse转换成特定的案例类?

scala - 在 Scala 中使用 Gson 序列化/反序列化案例对象

scala - Intellij 多模块 maven 项目,其中一个子模块中的更新不会传播到 war

generics - Scala 的 (2.8) list 如何工作?

scala - 有没有办法验证原始spark sql查询的语法?

scala - Iterator[Something] 到 Iterator[Seq[Something]]

scala - (Scala) IntelliJ IDEA 中的隐式参数菜单项。如何使用它 ?到底有什么好处呢?

arrays - 明智地聚合数组元素