我正在编写一个生成SQL的DSL。加载表的语法是:
session.activateWhere( _.User.ID == 490 )
这将从用户表中选择ID列为490.我可以使用“==”因为我可以覆盖“equals()”来生成正确的SQL。我的问题是“!=”不起作用,因为它调用equals()然后否定结果。可悲的是,“!=”是最终的,所以我无法覆盖它。在我的equals()方法中是否有任何方法可以告诉它是作为!=?
的一部分调用的我实施了“<>”从逻辑上做与“!=”相同的操作,它运行正常:
session.activateWhere( _.User.ID <> 490 )
我的问题是,不仅“!=”有效语法(对编译器而言),它将运行并生成与用户意图完全相反的语法。
答案 0 :(得分:5)
正如你所说,!=
是(类似于==
)final,所以不能被覆盖 - 这是有充分理由的。这就是大多数DLS使用===
作为替代方案的原因。
==
和!=
运算符可以很好地定义Scala中所有对象的含义。在我看来,改变某些物体的含义是非常危险的。
答案 1 :(得分:0)
如果您想使用==
和!=
,则必须覆盖equals
,hashcode
和canEqual
(特质等于)
看起来并不简单,你必须要好心。
网上有一些例子。 例如:https://www.safaribooksonline.com/library/view/scala-cookbook/9781449340292/ch04s16.html
另一个:https://groups.google.com/forum/#!msg/scala-user/Qosfawmaecw/RUWigwvVtQ4J