严格说来,这个其实跟另外三个不属于一类。
a === b
相当于 "如果我有一个贴了 a 标签的抽屉,那么把 b 放到这个抽屉里是否可行?"
作为 case equality operator, 其首要作用自然是在when/case
里,作为判断进入某个分支的依据
a = 5
case a
when Integer
"case Integer"
when 5
"case 5"
end
这段代码其实是会返回"case Integer"
的,因为
2.1.1 :043 > Integer === 5
=> true
相应的
2.1.1 :054 > (1..5) === 5
=> true
2.1.1 :055 > (1...5) === 5
=> false
2.1.1 :058 > /(a|e|i|o|u)/ === "hello"
=> true
对于Object#===
, 事实上等价于Object#==
.
但是对 Object 的子类,===
一般会被重写,使其在条件表达式里有意义。
==
是最为常用的用于比较两个对象值是否相等的方法
a == b
相当于判断"a 的值与 b 的值相同吗"
==
方法经常被 Object 子类重写以满足其自身需求
equal?
方法用来判断 2 个对象是否是同一个对象
a.equal? b
相当于判断"a 就是 b 吗"
2.1.1 :005 > "a" == "a"
=> true
2.1.1 :006 > "a".equal? "a"
=> false
2.1.1 :007 > :a.equal? :a
=> true
与==
不同,equal?
不应该被子类重写
与==
类似,但是可以看做是更严格的==
在Object
里,==
与eql?
是同意,但是很多子类会重写eql?
以提供更严格的比较,比如:
2.1.1 :010 > 1 == 1
=> true
2.1.1 :011 > 1 == 1.0
=> true
2.1.1 :012 > 1.eql? 1.0
=> false