gpt4 book ai didi

ruby - 是否需要覆盖 hash 和 eql?在 Ruby 中覆盖 == 运算符时?

转载 作者:数据小太阳 更新时间:2023-10-29 07:37:28 26 4
gpt4 key购买 nike

在 Java 和 C# 等语言中,如果要重写相等运算符,则还必须重写散列方法。

Whenever a.equals(b), then a.hashCode() must be same as b.hashCode()

据我所知,这些语言中的一些内部数据结构依赖于上述条件成立才能正常运行。

我想知道在 Ruby 中是否也是如此。重写==操作符时是否需要重写对象的hash方法?听说重写==时需要重写eql?。这些声明背后的原因是什么?如果您不覆盖这些声明,会发生什么情况?

最佳答案

不,您不需要覆盖eql?hash 方法。

但是,正如 tadman 提到的,您应该覆盖它们。你不知道eql如何?可能会被使用,如果您不覆盖散列,那么如果您将该对象用作散列键,您将得到奇怪的结果。看这个blog post .

说了这么多,你提出了一个有趣的观点:

In Java and C#, you must override the hash method as well.

如果不重写散列方法会怎样?它会不会编译失败,还是一种不好的做法?

感觉在Ruby中很少有像这样的硬性规定。我想知道与 C#、Java 和 C++ 等语言相比,Ruby 是否具有不同的范例。也许范式不同,因为 Ruby 是鸭子类型的,没有单独的编译过程。

关于ruby - 是否需要覆盖 hash 和 eql?在 Ruby 中覆盖 == 运算符时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38312697/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com