2017-02-10 65 views
2

使用表达 “_ =>” 下面的代码是不工作:不能在斯卡拉

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') 

这两个有效的解决方案。

问题:“_ =>”有什么问题?

非常感谢你

回答

6

有什么不对_ =>

没什么是错了与它。它对编译器具有特殊的含义。这意味着“我想忽略此值”。它是有道理的,如果你想忽略它,你想能够应用任何操作。它与placeholder语法如何具有特殊含义相似。

你可以这样做:

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

“_”符号用于制作匿名函数。下面的代码:

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' 

Becouse就需要生产函数有两个参数。 可以想见做转型是这样的:

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

Scala编译器甚至会扩大这一定义,但COUNT函数愿与下面签名功能:T => Boolean,不T => T => Boolean

例如,下面的编译:

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

*因为它需要产生带有两个参数的函数。*为什么?该语言本身可以说'_ =>'只是简单地将'_'绑定到一个新的变量名,类似于'_._ 1'的工作方式。 –

+0

我认为'_._ 1'只是产生一个函数'x => x._1',同样'_ => c'产生函数'x => c'',其中c是一个独立于x的表达式。 –