list.filter(!=)编译,但未按预期工作

问题描述 投票:2回答:1

下面的Scala代码可以编译,但是没有达到我的期望:

scala> List((1,1),(1,2)).filter(!=)
res1: List[(Int, Int)] = List((1,1), (1,2))

!=在上面的代码中指的是什么?

我知道我可以正确地将谓词写成

scala> List((1,1),(1,2)).filter { case (a, b) => a != b }
res1: List[(Int, Int)] = List((1,2))

但是我很好奇第一个表达式的实际作用。

scala
1个回答
1
投票

Scala编译器进行了以下扩展(使用-Xprint:typer标志运行scalac时,您可以自己看到这一点:

List.apply[(Int, Int)]
      (scala.Tuple2.apply[Int, Int](1, 1), scala.Tuple2.apply[Int, Int](1, 2))
    .filter(((x$1: Any) => this.!=(x$1)));

意味着它再次尝试比较this而不是将您的元组提升为Any,这不是您要尝试的。

© www.soinside.com 2019 - 2024. All rights reserved.