以下代码不起作用:
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>有什么问题?
非常感谢
答案 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