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"