主頁(yè) > 知識(shí)庫(kù) > Ruby里4種比較函數(shù)(equal?, eql?, ==, ===)詳解

Ruby里4種比較函數(shù)(equal?, eql?, ==, ===)詳解

熱門標(biāo)簽:常德電銷平臺(tái)外呼系統(tǒng)軟件價(jià)格 電銷機(jī)器人廠商代理 湖州u友防封電銷卡 徐州網(wǎng)絡(luò)外呼系統(tǒng)哪個(gè)好 白銀外呼paas系統(tǒng) 滴滴外呼系統(tǒng) 百度地圖標(biāo)注自定義圖片 地圖標(biāo)注賺錢項(xiàng)目注冊(cè) 高德地圖標(biāo)注客服

Ruby里面有4種比較方法,equal?, eql?, ==, ===,而且在不同的類里面表現(xiàn)的很不一樣。在使用的時(shí)候也特別容易搞糊涂。 這篇博文將演示一些代碼來(lái)講解各個(gè)方法。

== - 類意義上的 相等,需要每個(gè)類自己定義實(shí)現(xiàn)

在特定類中覺(jué)得兩個(gè)對(duì)象是否相同,需要看業(yè)務(wù)上的邏輯表象,所有由程序員覆蓋該方法的定義,決定兩個(gè)對(duì)象是否相同。

比如 String 類,他是來(lái)計(jì)較實(shí)際的文字串是否相同,而不在意是否來(lái)自同一個(gè)內(nèi)存區(qū)域。

>> a = "abc"
#=> "abc"

>> b = a + ""
#=> "abc"

?> a == b
#=> true

>> a.object_id
#=> 70255156346640

>> b.object_id
#=> 70255156340640

=== - 用在 case 語(yǔ)句里時(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 里面用來(lái)做成員值比較

[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

記憶方法

  1. == 按業(yè)務(wù)需求覆蓋該方法
  2. === 覆蓋 case 語(yǔ)句時(shí)的表現(xiàn)
  3. eql? 別名到 == 方法, 需要時(shí)覆蓋方法改變 Hash 比較時(shí)的表現(xiàn)
  4. equal? 不改動(dòng)
您可能感興趣的文章:
  • Ruby實(shí)現(xiàn)命令行中查看函數(shù)源碼的方法
  • Ruby中的方法(函數(shù))學(xué)習(xí)總結(jié)
  • Ruby中常用的字符串處理函數(shù)使用實(shí)例
  • ruby中的雙等號(hào)==問(wèn)題詳解

標(biāo)簽:荊門 三沙 梧州 張家界 遼寧 普洱 公主嶺 永州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Ruby里4種比較函數(shù)(equal?, eql?, ==, ===)詳解》,本文關(guān)鍵詞  Ruby,里,4種,比較,函數(shù),equal,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Ruby里4種比較函數(shù)(equal?, eql?, ==, ===)詳解》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Ruby里4種比較函數(shù)(equal?, eql?, ==, ===)詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章