Ruby中相等性判断的4种方法
很早就知道ruby有4种相等性判断方法,分别是:“==”,“===”,“equal?”和“eql?”,平常程序中都有使用,但是感觉对其缺乏深入理解,今天读rails部分源码的时候拿捏不定其中一个判断的意思,于是趁机深入研究了一番,总算觉得比较清楚了,今天做一下笔记,以作备忘。
“==”最常见的相等性判断
“==”使用最频繁,它通常用于对象的值相等性(语义相等)判断,在Object的方法定义中,“==”比较两个对象的object_id是否一致,通常子类都会重写覆盖这个方法,通过比较内部值来判断对象是否相等。
比如ActiveRecord::Base对“==”的定义
def==(comparison_object)
super||
comparison_object.instance_of?(self.class)&&
id.present?&&
comparison_object.id==id
end
通过model的id属性比较两个ActiveRecord::Base实例是否相等。
“===”用于case语句的相容判断
“===”主要用于case语句中对象的相容比较,看代码比较容易理解。
defwhat_is(obj)
caseobj
when/abc/
puts"includeabc"
when3..5
puts"in3..5"
whenSymbol
puts"Itisasymbol"
else
puts"unkonwn"
end
end
what_is("abcde")#=> "includeabc" what_is(4) #=> "in3..5" what_is(:a) #=> "Itisasymbol" what_is(100) #=> "unknown"