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