拜托,对不起我的英语:(
让我们通过例子来解释我的问题。我们有一个数组a
:
var a = Array(1,1,1,1,2)
我们可以:
过滤
a
:a.filter( _ < 2 )
计算 a 中的一些元素:
a.count (_ < 2)
获取集合中的独特元素:
a.filter { i => a.count(_ == i) == 1 }
问题是:如何在不引入变量i的情况下做第三个子句?是否可以这样写:
a.filter ( a.count ( _ == __) == 1 )
我知道我可以写这个(它仍然很短):
a.filter { i => a.count(_ == i) == 1 }
但我只是对答案感兴趣。
最佳答案
如果不引入变量 i
就无法做到这一点,因为它需要混合来自两个不同范围的变量(即所谓的 closure )。如果我们在不使用 _
占位符变量的情况下编写此代码,这将变得更加清晰。
a.filter( outer =>
a.count( inner =>
outer == inner
) == 1
)
对于 a
中 outer
的每个值,我们正在创建一个新函数传递给 count
,其中 outer
是常量,inner
作为参数传入。 _
只能作为最内层函数的占位符,不能代替outer
。这就是为什么
a.filter( outer =>
a.count(
outer == _
) == 1
)
编译但是
a.filter(
a.count( inner =>
_ == inner
) == 1
)
没有。
关于斯卡拉。具有短语法的嵌套 lambda 的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19916169/