我试图理解这四种方法之间的区别。我知道默认情况下,=调用方法equal?,当两个操作数引用完全相同的对象时,该方法返回true
==默认情况下也会调用==哪个调用equal?。。。好的,如果这三个方法都没有被覆盖,那么我猜
==,=和相等?做完全相同的事情吗
现在是eql?。(默认情况下)这是做什么的?它是否调用操作数的hash/id
为什么Ruby有这么多等号?它们应该在语义上有所不同吗
我将在这里大量引用对象文档,因为我认为它有一些很好的解释。我鼓励您阅读它,以及这些方法的文档,因为它们在其他类(如String)中被重写
旁注:如果您想在不同的对象上尝试这些方法,请使用以下方法:
类对象
定义所有_等于(o)
ops=[:==,:==,:eql?,:equal?]
Hash[ops.map(&;to_.s).zip(ops.map{s|send(s,o)})]
终止
终止
&引用;a";。所有“u等于”;“a”=&燃气轮机;{quot;==>;true,";=>;true,";eql?";true,";equal?>;false}
==-通用”;“平等”
在对象级别,
==仅当obj和other是同一对象时才返回true。通常,此方法在子类中被重写,以提供特定于类的含义
这是最常见的比较,也是你(作为一个类的作者)决定两个对象是否是;“相等”;或者不是
==-大小写相等
对于类对象,实际上与调用
#==相同,但通常由子体覆盖,以在case语句中提供有意义的语义
这是非常有用的。具有有趣的==实现的示例:
- 射程
- 正则表达式
- Proc(在Ruby 1.9中)
因此,您可以执行以下操作:
案例某些对象
何时/a正则表达式/
#正则表达式匹配
当2..4
#某些对象在范围2..4内
当lambda{| x |一些|疯狂|自定义|谓词}
#lambda返回真值
终止
请参阅我的答案,这里有一个简洁的例子,说明case+Regex如何使代码更干净。当然,通过提供您自己的==实现,您可以获得定制的案例语义
eql?–Hashequality
如果
obj和other引用相同的散列键,则eql?方法返回true。Hash使用它来测试成员是否相等对于类Object的对象,eql?与=子类通常通过将eql?别名为其重写的=方法来延续这一传统,但也有例外数值类型在=之间执行类型转换,但不在eql?之间执行类型转换,因此:1==1.0;符合事实的 1.eql?1.0#=>;错误的
因此,您可以自由地为自己的使用覆盖它,或者您可以覆盖==并使用别名:eql?:==</因此这两个方法的行为方式相同
相等?-标识比较
与
=不同,equal?方法决不能被子类覆盖:它用于确定对象标识(即a.equal?(b)iffa与b是同一对象)
这实际上是指针比较