早就知道Ruby有四種判斷相等的方法,在普通程序中使用,但是缺乏深入的理解,今天,武林技術頻道小編帶你來學習Ruby中相等性判斷的4種方法,希望對你在程序生涯有幫助!
“==” 最常見的相等性判斷
“==” 使用最頻繁,它通常用于對象的值相等性(語義相等)判斷,在 Object 的方法定義中,“==” 比較兩個對象的 object_id 是否一致,通常子類都會重寫覆蓋這個方法,通過比較內部值來判斷對象是否相等。
比如 ActiveRecord::Base 對 “==” 的定義
?
?
通過 model 的 id 屬性比較兩個 ActiveRecord::Base 實例是否相等。
“===” 用于 case 語句的相容判斷
“===” 主要用于 case 語句中對象的相容比較,看代碼比較容易理解。
?
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?(klass),所以 case 可以現實 obj 的類型判斷。
特別要注意的是和其他相等判斷不同 “===” 通常沒法交換,也就是很可能 a.===(b) != b.===(a) ,比如 /abc/ === "abcd" 為 true,但 "abcd" === /abc/ 為 false。
“equal?” 相同對象判斷
“equal?” 其實是最簡單的,但是也是最容易讓人搞混的判斷。說它簡單是因為這個方法的語義是比較兩個對象是否相同(是否有相同的 object_id),Object 的方法適用所有對象,不應該對其重寫覆蓋。說它容易讓人搞混,是因為 ruby 和 java 中 “==” 和 “equal?” 方法的語義正好是相反的,ruby 中 “equal?” 表示對象引用相同,而 java 表示對象值相同。
“eql?” 對象 hash 值判斷
eql? 用于對象 hash 值判斷,如果兩個對象的 hash 值相等,就返回 true,否則返回 false。Object 的定義里,“eql?” 和 “==” 是等價的。通常可以把 “eql?” 看作比 “==” 更嚴格的相等,比如:
Ruby中相等性判斷的4種方法就為各位朋友們介紹到這里了。想要學習更多的技術知識,請繼續關注武林技術頻道吧!
|
新聞熱點
疑難解答
圖片精選