斯卡拉:有没有办法覆盖“不等于”(!=)?

时间:2015-06-18 03:58:35

标签: scala override equals equals-operator

我正在编写一个生成SQL的DSL。加载表的语法是:

    session.activateWhere( _.User.ID == 490 )

这将从用户表中选择ID列为490.我可以使用“==”因为我可以覆盖“equals()”来生成正确的SQL。我的问题是“!=”不起作用,因为它调用equals()然后否定结果。可悲的是,“!=”是最终的,所以我无法覆盖它。在我的equals()方法中是否有任何方法可以告诉它是作为!=?

的一部分调用的

我实施了“<>”从逻辑上做与“!=”相同的操作,它运行正常:

    session.activateWhere( _.User.ID <> 490 )

我的问题是,不仅“!=”有效语法(对编译器而言),它将运行并生成与用户意图完全相反的语法。

2 个答案:

答案 0 :(得分:5)

正如你所说,!=是(类似于==)final,所以不能被覆盖 - 这是有充分理由的。这就是大多数DLS使用===作为替代方案的原因。

==!=运算符可以很好地定义Scala中所有对象的含义。在我看来,改变某些物体的含义是非常危险的。

答案 1 :(得分:0)

如果您想使用==!=,则必须覆盖equalshashcodecanEqual(特质等于)

看起来并不简单,你必须要好心。

网上有一些例子。 例如:https://www.safaribooksonline.com/library/view/scala-cookbook/9781449340292/ch04s16.html

另一个:https://groups.google.com/forum/#!msg/scala-user/Qosfawmaecw/RUWigwvVtQ4J