很早就知道 ruby 有 4 种相等性判断方法,分别是:“==”,“===”,“equal"codetitle">复制代码 代码如下:
def ==(comparison_object)
super ||
comparison_object.instance_of"codetitle">复制代码 代码如下:
def what_is(obj)
case obj
when /abc/
puts "include abc"
when 3..5
puts "in 3..5"
when Symbol
puts "It is a symbol"
else
puts "unkonwn"
end
end
what_is("abcde") # => "include abc"
what_is(4) # => "in 3..5"
what_is(:a) # => "It is a symbol"
what_is(100) # => "unknown"
case 背后是拿每一个 when 后面的对象与 obj 进行 === 方法计算比较,比如上面的代码就是 分别求 /abc/.===(obj) , (3..5).===(obj) , Symbol.===(obj) 。
关键得看 === 方法里如何定义, Class 类中, === 定义为 obj.is_a"abcd" 为 true,但 "abcd" === /abc/ 为 false。
“equal"codetitle">复制代码 代码如下:
1 == 1.0 #=> true
1.eql? 1.0 #=> false