Ruby中相等性判斷的4種方法

2022-09-26 06:00:17 字數 1927 閱讀 6934

很早就知道 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...