佳木斯湛栽影视文化发展公司

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

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

熱門標簽:語音系統(tǒng) 企業(yè)做大做強 Win7旗艦版 呼叫中心市場需求 電話運營中心 硅谷的囚徒呼叫中心 百度AI接口 客戶服務

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

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

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

比如 String 類,他是來計較實際的文字串是否相同,而不在意是否來自同一個內存區(qū)域。

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

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

?> a == b
#=> true

>> a.object_id
#=> 70255156346640

>> b.object_id
#=> 70255156340640

=== - 用在 case 語句里時會調用的方法

通常用在 case 比較調用該方法,比如

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? - 內存地址相同的對象

該方法不應該被子類覆蓋
比較的是兩個對象在內存中是否相同,是否有同一個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

記憶方法

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

標簽:海南 長沙 安康 喀什 濟南 山西 崇左 山西

巨人網絡通訊聲明:本文標題《Ruby里4種比較函數(shù)(equal?, eql?, ==, ===)詳解》,本文關鍵詞  ;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    扬州市| 桦川县| 木兰县| 罗山县| 德保县| 灵宝市| 曲松县| 普兰县| 镇江市| 安顺市| 蓬莱市| 安新县| 山东省| 沁水县| 疏附县| 宜阳县| 石台县| 巴楚县| 秦皇岛市| 新宁县| 酒泉市| 镶黄旗| 蓬莱市| 池州市| 定襄县| 平顺县| 延安市| 竹溪县| 晋江市| 永丰县| 永定县| 绥滨县| 林西县| 炉霍县| 海林市| 泾阳县| 巴林左旗| 宝丰县| 宝兴县| 磐石市| 武冈市|