Ruby中相等性判斷的4種方法
很早就知道 ruby 有 4 種相等性判斷方法,分別是:“==”,“===”,“equal?” 和 “eql?”,平常程序中都有使用,但是感覺(jué)對(duì)其缺乏深入理解,今天讀 rails 部分源碼的時(shí)候拿捏不定其中一個(gè)判斷的意思,于是趁機(jī)深入研究了一番,總算覺(jué)得比較清楚了,今天做一下筆記,以作備忘。
“==” 最常見(jiàn)的相等性判斷
“==” 使用最頻繁,它通常用于對(duì)象的值相等性(語(yǔ)義相等)判斷,在 Object 的方法定義中,“==” 比較兩個(gè)對(duì)象的 object_id 是否一致,通常子類都會(huì)重寫(xiě)覆蓋這個(gè)方法,通過(guò)比較內(nèi)部值來(lái)判斷對(duì)象是否相等。
比如 ActiveRecord::Base 對(duì) “==” 的定義
def ==(comparison_object)
super ||
comparison_object.instance_of?(self.class) &&
id.present? &&
comparison_object.id == id
end
通過(guò) model 的 id 屬性比較兩個(gè) ActiveRecord::Base 實(shí)例是否相等。
“===” 用于 case 語(yǔ)句的相容判斷
“===” 主要用于 case 語(yǔ)句中對(duì)象的相容比較,看代碼比較容易理解。
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 背后是拿每一個(gè) when 后面的對(duì)象與 obj 進(jìn)行 === 方法計(jì)算比較,比如上面的代碼就是 分別求 /abc/.===(obj) , (3..5).===(obj) , Symbol.===(obj) 。
關(guān)鍵得看 === 方法里如何定義, Class 類中, === 定義為 obj.is_a?(klass),所以 case 可以現(xiàn)實(shí) obj 的類型判斷。
特別要注意的是和其他相等判斷不同 “===” 通常沒(méi)法交換,也就是很可能 a.===(b) != b.===(a) ,比如 /abc/ === "abcd" 為 true,但 "abcd" === /abc/ 為 false。
“equal?” 相同對(duì)象判斷
“equal?” 其實(shí)是最簡(jiǎn)單的,但是也是最容易讓人搞混的判斷。說(shuō)它簡(jiǎn)單是因?yàn)檫@個(gè)方法的語(yǔ)義是比較兩個(gè)對(duì)象是否相同(是否有相同的 object_id),Object 的方法適用所有對(duì)象,不應(yīng)該對(duì)其重寫(xiě)覆蓋。說(shuō)它容易讓人搞混,是因?yàn)?ruby 和 java 中 “==” 和 “equal?” 方法的語(yǔ)義正好是相反的,ruby 中 “equal?” 表示對(duì)象引用相同,而 java 表示對(duì)象值相同。
“eql?” 對(duì)象 hash 值判斷
eql? 用于對(duì)象 hash 值判斷,如果兩個(gè)對(duì)象的 hash 值相等,就返回 true,否則返回 false。Object 的定義里,“eql?” 和 “==” 是等價(jià)的。通常可以把 “eql?” 看作比 “==” 更嚴(yán)格的相等,比如:
1 == 1.0 #=> true
1.eql? 1.0 #=> false
相關(guān)文章
Rails應(yīng)用程序中同時(shí)修改操作沖突問(wèn)題的解決方案
這篇文章主要介紹了Rails應(yīng)用程序中同時(shí)修改操作沖突問(wèn)題的解決方案,本文講解使用Rails 的 樂(lè)觀鎖解決這個(gè)問(wèn)題并給出了代碼救命,需要的朋友可以參考下2015-03-03
采用UTF-8解決Ruby on Rails程序的中問(wèn)題
將.rb文件和.rhtml文件都保存為utf-8格式2008-12-12
Ruby中的Proc類及Proc的類方法Proc.new的使用解析
用Proc類可以用Proc.new來(lái)創(chuàng)建一個(gè)Proc類,進(jìn)而來(lái)操作塊,這里我們就來(lái)進(jìn)行Ruby中的Proc類及Proc的類方法Proc.new的使用解析.2016-05-05
在Ruby中處理XML和XSLT以及XPath的簡(jiǎn)單教程
這篇文章主要介紹了在Ruby中處理XML和XSLT以及XPath的簡(jiǎn)單教程,對(duì)Ruby on Rails的學(xué)習(xí)上手有一定的幫助,需要的朋友可以參考下2015-04-04
ruby+nokogori抓取糗事百科前10頁(yè)并存儲(chǔ)進(jìn)數(shù)據(jù)庫(kù)示例
這篇文章主要介紹了ruby+nokogori抓取糗事百科前10頁(yè)并存儲(chǔ)進(jìn)數(shù)據(jù)庫(kù)示例,需要的朋友可以參考下2014-05-05

