Ruby里4種比較函數(shù)(equal?, eql?, ==, ===)詳解
Ruby里面有4種比較方法,equal?, eql?, ==, ===,而且在不同的類里面表現(xiàn)的很不一樣。在使用的時(shí)候也特別容易搞糊涂。 這篇博文將演示一些代碼來講解各個(gè)方法。
== - 類意義上的 相等,需要每個(gè)類自己定義實(shí)現(xiàn)
在特定類中覺得兩個(gè)對(duì)象是否相同,需要看業(yè)務(wù)上的邏輯表象,所有由程序員覆蓋該方法的定義,決定兩個(gè)對(duì)象是否相同。
比如 String 類,他是來計(jì)較實(shí)際的文字串是否相同,而不在意是否來自同一個(gè)內(nèi)存區(qū)域。
>> a = "abc" #=> "abc" >> b = a + "" #=> "abc" ?> a == b #=> true >> a.object_id #=> 70255156346640 >> b.object_id #=> 70255156340640
=== - 用在 case 語句里時(shí)會(huì)調(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? - 通常意義上的 相等
如果兩個(gè)對(duì)象的值相同將返回 true,如果重新定義了子類的 == 方法,一般需要 alias 到 eql? 方法。 當(dāng)然也有例外,整數(shù)與小數(shù)的比較兩個(gè)方法的返回值就不同。
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"
所以什么時(shí)候應(yīng)該覆蓋這個(gè)方法就看你想讓他在 Hash 比較時(shí)如何表現(xiàn)。
equal? - 內(nèi)存地址相同的對(duì)象
該方法不應(yīng)該被子類覆蓋
比較的是兩個(gè)對(duì)象在內(nèi)存中是否相同,是否有同一個(gè)object_id值
Rails中及時(shí)相同的對(duì)象
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è)務(wù)需求覆蓋該方法
- === 覆蓋 case 語句時(shí)的表現(xiàn)
- eql? 別名到 == 方法, 需要時(shí)覆蓋方法改變 Hash 比較時(shí)的表現(xiàn)
- equal? 不改動(dòng)
相關(guān)文章
Rails bundle命令安裝mysql gem包出錯(cuò)的解決方法
這篇文章主要介紹了Rails bundle命令安裝mysql gem包出錯(cuò)的解決方法,本文原因是沒有安裝mysql開發(fā)包,需要的朋友可以參考下2014-08-08Ruby實(shí)現(xiàn)郵件主動(dòng)推送觸發(fā)程序
這篇文章主要介紹了Ruby實(shí)現(xiàn)郵件主動(dòng)推送觸發(fā)程序,本文給出了客戶端輪詢和服務(wù)器主動(dòng)推送的代碼實(shí)例,需要的朋友可以參考下2015-01-01Ruby實(shí)現(xiàn)二分搜索(二分查找)算法的簡(jiǎn)單示例
二分查找是一種在已經(jīng)過排序的數(shù)組中搜索指定元素用的算法,這里我們就來看一下Ruby實(shí)現(xiàn)二分搜索(二分查找)算法的簡(jiǎn)單示例:2016-07-07Ruby中XML格式數(shù)據(jù)處理庫REXML的使用方法指南
這篇文章主要介紹了Ruby中XML格式數(shù)據(jù)處理庫REXML的使用方法指南,值得注意的REXML庫處理XML字符串時(shí)的編碼問題,是需要的朋友可以參考下2016-04-04Ruby配置rspec和RestClient來檢測(cè)服務(wù)器
這篇文章主要介紹了Ruby配置rspec和RestClient來檢測(cè)服務(wù)器的方法,包括JSON文件的相關(guān)配置,需要的朋友可以參考下2015-07-07實(shí)例解析Ruby設(shè)計(jì)模式開發(fā)中對(duì)觀察者模式的實(shí)現(xiàn)
這篇文章主要介紹了實(shí)例解析Ruby設(shè)計(jì)模式開發(fā)中對(duì)觀察者模式的實(shí)現(xiàn),Ruby中自帶的observer類自然是絕佳的使用示例,需要的朋友可以參考下2016-04-04使用Ruby程序?qū)崿F(xiàn)web信息抓取的教程
這篇文章主要介紹了使用Ruby程序?qū)崿F(xiàn)web信息抓取的教程,本文來自于IBM官方網(wǎng)站技術(shù)文檔,需要的朋友可以參考下2015-04-04