繁体   English   中英

Scala匿名函数语法

[英]Scala anonymous function syntax

我是斯卡拉新手。

有什么区别

 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相同。 花括号总是可以用来定义一个包含一系列表达式的块,该块返回最后一个表达式。 一个特殊情况是单个表达式的块,在这种情况下,花括号与括号扮演相同的角色。 所有这些意味着您始终可以在表达式周围添加多余的括号或大括号。 所以以下都是等价的: 123{123}(123)({123})等等。

这也意味着:

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

是相同的

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

这是一样的

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

等等。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM