无法使用表达式" _ =>"在斯卡拉

时间:2017-02-10 13:36:59

标签: scala

以下代码不起作用:

val neighbors = ('a', List(1,2,3)) #:: ('b', List(2,3,4)) #:: ('c', List(3,4,5)) #:: Stream.empty
neighbors.count(_ => _._1 == 'a'))

但是我能做到:

neighbors.count(_._1 == 'a')

或:

neighbors.count(elem => elem._1 == 'a')

两种有效的解决方案。

问题:" _ =>"&#34>有什么问题?

非常感谢

2 个答案:

答案 0 :(得分:6)

  

_ =>有什么问题?

没有什么错误。它只对编译器有特殊意义。这意味着“我想忽略此值”。有意义的是,如果你想忽略它,你希望能够对它应用任何操作。它类似于占位符语法也具有特殊含义。

你可以这样做:

neighbors.count(_._1 == 'a')

因为这是由规范定义为匿名函数中的占位符语法,扩展为

neighbors.count(x => x._1 == 'a')

根据规范,我找不到任何正式的内容,但它确实在6.23 Anonymous Functions下提供了这个示例:

_ => 5                             // The function that ignores its argument
                                   // and always returns 5.

我还在旧的Scala语言邮件列表中找到了this post

答案 1 :(得分:1)

" _"符号用于制作匿名函数。关注您的代码:

neighbours.count(_._1 == 'a')

转换为

neighbours.count(x => x._1 == 'a')

如果有两个或更多下划线,编译器会尝试使用更多参数派生函数:

val numbers = List(1, 3, 4, 5, 6)
numbers.reduce(_ * _)

上面的代码转换为:

numbers.reduce((x1, x2) => x1 * x2)

现在应该很明显,没有明确的转变方法:

_ => _.1 == 'a'

因为它需要生成带有两个参数的函数。 可以想象做这样的转变:

x1 => x2 => x2._1 == 'a'

Scala编译器甚至会扩展此定义,但count函数需要具有以下签名的函数:T => Boolean,而不是T => T => Boolean

例如,以下编译:

val test: Int => Int => Boolean = _ => _ == 3