Ruby里4種比較函數(shù)(equal?, eql?, ==, ===)詳解
Ruby里面有4種比較方法,equal?, eql?, ==, ===,而且在不同的類里面表現(xiàn)的很不一樣。在使用的時候也特別容易搞糊涂。 這篇博文將演示一些代碼來講解各個方法。
== - 類意義上的 相等,需要每個類自己定義實現(xiàn)
在特定類中覺得兩個對象是否相同,需要看業(yè)務上的邏輯表象,所有由程序員覆蓋該方法的定義,決定兩個對象是否相同。
比如 String 類,他是來計較實際的文字串是否相同,而不在意是否來自同一個內(nèi)存區(qū)域。
>> a = "abc" #=> "abc" >> b = a + "" #=> "abc" ?> a == b #=> true >> a.object_id #=> 70255156346640 >> b.object_id #=> 70255156340640
=== - 用在 case 語句里時會調(diào)用的方法
通常用在 case 比較調(diào)用該方法,比如
case some_object when /a regex/ # The regex matches when String # some_object is kind of String when 2..4 # some_object is in the range 2..4 when lambda {|x| some_crazy_custom_predicate } # the lambda returned true end
等同于
if /a regex/ === some_object # The regex matches elsif String === some_object # some_object is kind of object elsif (2..4) === some_object # some_object is in the range 2..4 elsif lambda {|x| some_crazy_custom_predicate } === some_object # the lambda returned true end
eql? - 通常意義上的 相等
如果兩個對象的值相同將返回 true,如果重新定義了子類的 == 方法,一般需要 alias 到 eql? 方法。 當然也有例外,整數(shù)與小數(shù)的比較兩個方法的返回值就不同。
1 == 1.0 #=> true 1.eql? 1.0 #=> false
eql? 用在 Hash 里面用來做成員值比較
[1] pry(main)> hash = Hash.new #=> {} [2] pry(main)> hash[2] = "a" #=> "a" [3] pry(main)> hash[2.0] = "b" #=> "b" [4] pry(main)> hash[2] #=> "a" [5] pry(main)> hash[2.0] #=> "b" [6] pry(main)> hash[2.00] = "c" #=> "c" [7] pry(main)> hash[2.0] #=> "c"
所以什么時候應該覆蓋這個方法就看你想讓他在 Hash 比較時如何表現(xiàn)。
equal? - 內(nèi)存地址相同的對象
該方法不應該被子類覆蓋
比較的是兩個對象在內(nèi)存中是否相同,是否有同一個object_id值
Rails中及時相同的對象
q = User.first User Load (40.4ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1 #=> #<User id: 1, email: "ryan@wongyouth.com"> q2 = User.first User Load (0.4ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1 #=> #<User id: 1, email: "ryan@wongyouth.com"> q.equal? q2 #=> false
記憶方法
- == 按業(yè)務需求覆蓋該方法
- === 覆蓋 case 語句時的表現(xiàn)
- eql? 別名到 == 方法, 需要時覆蓋方法改變 Hash 比較時的表現(xiàn)
- equal? 不改動
相關文章
Rails bundle命令安裝mysql gem包出錯的解決方法
這篇文章主要介紹了Rails bundle命令安裝mysql gem包出錯的解決方法,本文原因是沒有安裝mysql開發(fā)包,需要的朋友可以參考下2014-08-08Ruby中XML格式數(shù)據(jù)處理庫REXML的使用方法指南
這篇文章主要介紹了Ruby中XML格式數(shù)據(jù)處理庫REXML的使用方法指南,值得注意的REXML庫處理XML字符串時的編碼問題,是需要的朋友可以參考下2016-04-04實例解析Ruby設計模式開發(fā)中對觀察者模式的實現(xiàn)
這篇文章主要介紹了實例解析Ruby設計模式開發(fā)中對觀察者模式的實現(xiàn),Ruby中自帶的observer類自然是絕佳的使用示例,需要的朋友可以參考下2016-04-04