首页 > 解决方案 > list.filter(!=) 编译,但没有按预期工作

问题描述

以下 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

解决方案


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

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,这不是您想要做的。


推荐阅读