Ruby里4種比較函數(shù)(equal?, eql?, ==, ===)詳解
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_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? 方法。 當(dāng)然也有例外,整數(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"
所以什么時候應(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
記憶方法
- == 按業(yè)務(wù)需求覆蓋該方法
- === 覆蓋 case 語句時的表現(xiàn)
- eql? 別名到 == 方法, 需要時覆蓋方法改變 Hash 比較時的表現(xiàn)
- equal? 不改動
相關(guān)文章
Ruby on Rails在Ping ++ 平臺實現(xiàn)支付
本文給大家分享的是使用Ruby on Rails在Ping ++ 平臺實現(xiàn)支付功能的代碼,非常的實用,有需要的小伙伴可以參考下。2016-02-02
Ruby中的類Google Map/Reduce框架Skynet介紹
這篇文章主要介紹了Ruby中的類Google Map/Reduce框架Skynet介紹,Skynet是一款創(chuàng)建分布式應(yīng)用程序的框架,需要的朋友可以參考下2015-01-01

