上一篇介紹完 "="、"==" 以及 "==="
其實eql? 跟 equal?也是他們的親戚,共通點就是他們都一樣會回傳一個boolean值
eql?在不同型態下的比較定義上也有點不同,
但實質上都是在比較型態
以及值
,
例如數字上的比較:
Returns true if num and numeric are the same type and have equal values. Contrast this with Numeric#==
1.eql?1.0
false
1 == 1.0
true
雖然實質上都是1,但型態上整數(Integer)就不等於浮點數(Float),所以這無法成立,
在文件定義上也提到,eql?跟 "==" 並不相同,雖然同樣是比較,但"=="只會去比較兩者的值是否相等,不會把型態考慮在內。
比較字串時,則是比較字串的內容,以及長度。
Two strings are equal if they have the same length and content.
比較陣列,當然就是比較陣列中內容物是否相同囉。
Returns true if self and other are the same object, or are both arrays with the same content (according to Object#eql?).
最後我們來到equal?,先看文件定義上:
Equality — At the Object level, == returns true only if obj and other are the same object. Typically, this method is overridden in descendant classes to provide class-specific meaning.
equal?則是物件
層級間的比較,所以我們可以從object_id中來確認是否相同
a = "1"
b = "1"
a.equal?b
false
a.object_id
70139466993480
b.object_id
70139463340960
即使 a 跟 b的資料型態一樣甚至內容也相同,但在equal?的比較上卻得到了false
我們直接詢問了 a, b兩者的object_id,可以發現兩者的object_id並不相同
,
那object_id又是什麼?以我的認知來說,當我們去做出一個實質的變數時,他存放在記憶體空間的位置。
一樣都是字串"1",但他實際上存放的位置是不相同的,也就得到了我們使用equal?這個方法的結果。