【问题标题】:Scala: Is there any way to override "not equals" (!=)?Scala:有没有办法覆盖“不等于”(!=)?
【发布时间】:2023-03-31 14:43:02
【问题描述】:

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

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

这将从 ID 列为 490 的 User 表中进行选择。我可以使用“==”,因为我可以覆盖“equals()”来生成正确的 SQL。我的问题是“!=”不起作用,因为它调用 equals() 然后否定结果。可悲的是“!=”是最终的,所以我不能覆盖它。我的 equals() 方法中有什么方法可以告诉它是作为 != 的一部分调用的吗?

我已经实现了一个“”操作,它在逻辑上与“!=”做同样的事情,它工作正常:

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

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

【问题讨论】:

标签: scala overriding equals equals-operator


【解决方案1】:

正如你所说,!= 是(类似于==)最终的,因此不能被覆盖 - 有一个很好的理由。这就是为什么大多数 DLS 使用 === 作为替代方案的原因。

==!= 运算符对 Scala 中的所有对象都有很好的定义。在我看来,更改某些对象的含义是非常危险的。

【讨论】:

  • 通常我完全同意。但是,在这种情况下,我试图在仅用于生成 SQL 的类上覆盖 equals()。该类具有私有构造函数,因此不能在此上下文之外使用,这通常使其安全。也就是说,我理解制作 != final 的总体原因。感谢您的回复!
【解决方案2】:

如果你想使用==!=,你必须覆盖equalshashcodecanEqual(trait Equals)

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

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

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

【讨论】:

    猜你喜欢
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 2012-09-03
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多