国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Ruby > 正文

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

2020-10-29 19:36:43
字體:
供稿:網(wǎng)友

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

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

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

比如 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_objectwhen /a regex/ # The regex matcheswhen String # some_object is kind of Stringwhen 2..4 # some_object is in the range 2..4when lambda {|x| some_crazy_custom_predicate } # the lambda returned trueend

等同于

if /a regex/ === some_object # The regex matcheselsif String === some_object # some_object is kind of objectelsif (2..4) === some_object # some_object is in the range 2..4elsif lambda {|x| some_crazy_custom_predicate } === some_object # the lambda returned trueend

eql? - 通常意義上的 相等

如果兩個對象的值相同將返回 true,如果重新定義了子類的 == 方法,一般需要 alias 到 eql? 方法。 當(dāng)然也有例外,整數(shù)與小數(shù)的比較兩個方法的返回值就不同。

1 == 1.0  #=> true1.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"

所以什么時候應(yīng)該覆蓋這個方法就看你想讓他在 Hash 比較時如何表現(xiàn)。

equal? - 內(nèi)存地址相同的對象

該方法不應(yīng)該被子類覆蓋
比較的是兩個對象在內(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

記憶方法

  1. == 按業(yè)務(wù)需求覆蓋該方法
  2. === 覆蓋 case 語句時的表現(xiàn)
  3. eql? 別名到 == 方法, 需要時覆蓋方法改變 Hash 比較時的表現(xiàn)
  4. equal? 不改動
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 峨山| 岳西县| 德江县| 静宁县| 昆明市| 昭苏县| 崇阳县| 浙江省| 苍梧县| 曲麻莱县| 竹溪县| 泾阳县| 手游| 青铜峡市| 江孜县| 灵台县| 郎溪县| 射阳县| 温泉县| 和平县| 自贡市| 梅河口市| 宁夏| 罗城| 惠来县| 信宜市| 延安市| 阜平县| 铁岭市| 富锦市| 铁力市| 红桥区| 长武县| 庐江县| 壶关县| 井研县| 始兴县| 从江县| 荃湾区| 炉霍县| 沧源|