很早就知道 ruby 有 4 種相等性判斷方法,分別是:「==」,「===」,「equal?」 和 「eql?」,平常程式中都有使用,但是感覺對其缺乏深入理解,今天讀 rails 部分原始碼的時候拿捏不定其中乙個判斷的意思,於是趁機深入研究了一番,總算覺得比較清楚了,今天做一下筆記,以作備忘。
「==」 最常見的相等性判斷
「==」 使用最頻繁,它通常用於物件的值相等性(語義相等)判斷,在 object 的方法定義中,「==」 比較兩個物件的 object_id 是否一致,通常子類都會重寫覆蓋這個方法,通過比較內部值來判斷物件是否相等。
比如 activerecord::base 對 「==」 的定義
複製** **如下:
def ==(comparison_object)
super ||
comparison_object.instance_of?(self.class) &&
www.cppcns.com id.present? &&
comparison_object.id == id
end通過 model 的 id 屬性比較兩個 activerecord::base 例項是否相等。
「===」 用於 case 語句的相容判斷
「===」 主要用於 case 語句中物件的相容比較,看程式設計客棧**比較容易理解。
複製** **如下:
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"
endendwhat_is("pkzjevqabcde") # => "include abc"
what_is(4) &n程式設計客棧bsp; # => "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 和 j**a 中 「==」 和 「equal?」 方法的語義正好是相反的,ruby 中 「equal?」 表示物件引用相同,而 j**a 表示物件值相同。
「eql?」 物件 hash 值判斷
eql? 用於物件 hash 值判斷,如果兩個物件的 hash 值相等,就返回 true,否則返回 false。object 的定義裡,「eql?」 和 「==」 是等價的。通常可以把 「eql?」 看作比 「==」 更嚴格的相等,比如:
複製** **如下:
1 == 1.0 #=> true
1.eql? 1.0 #=> false
本文標題: ruby中相等性判斷的4種方法
本文位址: /jiaoben/ruby/121278.html
perl 判斷陣列相等的三種方法
1.陣列相等,陣列成員相同,位置也相同 一般的如果判斷 array1 等於 array2 a.陣列長度相同 array1 array2,比較陣列長度,不能使用length函式,length只適用string型別 陣列引數傳遞,不能直接傳遞 sub compare else if flag 1 els...
判斷陣列型別的4種方法
1 2對陣列型別的判斷3 45var n 1,6 s hello 7 b true 8 un undefined,9 nu null 10 fun function 11 console.log n 型別是 typeof n 12 console.log b 型別是 typeof b 13 cons...
判斷素數的4種方法(C語言)
判斷素數的4種方法素數定義 質數又稱素數。指整數在乙個大於1的自然數中,除了1和此整數自身外,沒法被其他自然數整除的數。換句話說,只有兩個正因數 1和自己 的自然數即為素數。比1大但不是素數的數稱為合數,1和0既非素數也非合數。素數在數論中有著很重要的作用。一言不合直接上 include inclu...