详解Ruby里用到的比较函数(equal?, eql?, ==, ===)
Ruby里面有4种比较方法,equal?
, eql?
, ==
, ===
,而且在不同的类里面表现的很不一样。在使用的时候也特别容易搞糊涂。
这篇博文将演示一些代码来讲解各个方法。
==
- 类意义上的 相等
,需要每个类自己定义实现
在特定类中觉得两个对象是否相同,需要看业务上的逻辑表象,所有由程序员覆盖该方法的定义,决定两个对象是否相同。
比如 String
类,他是来计较实际的文字串是否相同,而不在意是否来自同一个内存区域。
1 | "abc" a = |
===
- 用在 case
语句里时会调用的方法
通常用在 case
比较调用该方法,比如
1 | case some_object |
等同于
1 | if /a regex/ === some_object |
eql?
- 通常意义上的 相等
如果两个对象的值相同将返回 true,如果重新定义了子类的 ==
方法,一般需要 alias 到 eql?
方法。
当然也有例外,整数与小数的比较两个方法的返回值就不同。
1 | 1 == 1.0 #=> true |
eql?
用在 Hash 里面用来做成员值比较
1 | [1] pry(main)> hash = Hash.new |
所以什么时候应该覆盖这个方法就看你想让他在 Hash 比较时如何表现。
equal?
- 内存地址相同的对象
- 该方法不应该被子类覆盖
- 比较的是两个对象在内存中是否相同,是否有同一个
object_id
值 - Rails中及时相同的对象
1 | q = User.first |
记忆方法
==
按业务需求覆盖该方法===
覆盖case
语句时的表现eql?
别名到==
方法, 需要时覆盖方法改变Hash
比较时的表现equal?
不改动
延伸阅读
http://stackoverflow.com/questions/7156955/whats-the-difference-between-equal-eql-and