1、equal?
我們經常要比較兩個對象,Ruby中提供了多種比較對象的方法。我們可以通過equal?方法比較兩個對象是否相同,通過這種方式是比較兩個值是否指向同一個對象的引用。比如:
a = "Ruby" # 一個字串對象。 b = c = "Ruby" # 兩個字串對象指向動一個引用。 a.equal?(b) # false: a和b是不同的對象。 b.equal?(c) # true: b和c指向同一個引用。
這種比較方式實際上是比較兩個對象的ID是否相同,顯然a是一個對象,而b和c指向另一個對象,他們的對象ID是不同的:
a.object_id == b.object_id # 等同於 a.equal?(b)
2、==來比較對象是否相等
他的作用和equal?方法是不一樣,它比較的是兩個對象的內容是否相同:
a = "Ruby" # 定義一個字串對象
b = "Ruby" # 雖然和a的內容相同,但是他們是不同的對象 a.equal?(b) # false: a和b指向不同的對象 a == b # true: 他們的內容是相同的
除了字串外,數組和字典類也定義了==操作符,如果兩個數組或兩個字典對象中元素個數相同,且每個元素都相同,那麼==返回true.
Numerics對象在比較的時候會做一個簡單的最新轉換,所以Fixnum類型的1和Float類型的1.0的比較結果是相等。
同樣,你可以使用!=來判斷兩個對象是否不等。
3、eql?方法
Ruby還提供了eql?方法,它與equal?的功能相同,是一種更精鍊的寫法。
4、三個等號的比較操作===
通常情況下這中方式與==是一樣的,但是在某些特定情況下,===有特殊的含義:
在Range中===用於判斷等號右邊的對象是否包含於等號左邊的Range;
Regex中用於判斷一個字串是否匹配模式,
Class定義===來判斷一個對象是否為類的執行個體,
Symbol定義===來判斷等號兩邊的符號對象是否相同。
(1..10) === 5 # true: 5屬於range 1..10
/\d+/ === "123" # true: 字串匹配這個模式 String === "s" # true: "s" 是一個字串類的執行個體 :s === "s" # true