equal?メソッド
以下の例を見てみます。
p "foo".equal?("foo") # => false
これは一見して、同じ値に見えますが、falseが出力されます。
equal?メソッド
では、内容や値で2つのオブジェクトを比較するのではなく、オブジェクトIDで2つの値比較します。
そしてこれから紹介する他の等値演算子と使い方に注意しなければいけないことは、equal?メソッドをオーバーライドしてはいけないということです。
比較しているオブジェクトの両方が、メモリ内の同じオブジェクトを指していない限りtrueを返してはいけないように動作すべきと考えられています。
"=="演算子
数値の比較でよくみる演算子です。
数値だけでなく、文字列の比較にも使用できます。
"foo" == "foo" # => ture
1.0 == 1 # => true
FixnumとFloatの比較でも数値が同等であればtrueを返します。
⇨@scivolaよりご指摘あり。Ruby 3.2で廃止。
eql?メソッド
基本的には==演算子
を同じ動きをしますが、特にHashキーを比較するのに使用されます。
"==="演算子
case式で使用されます。
暗黙的に使用されているため、caseが使われている式では見かけないことが多いかもしれません。
例を見てみます。
a = "foo"
case a
when "bar"
p "bar"
when "baz"
p "baz"
else
p "Erorr"
end
# => "Erorr"
これを書き換えます。
a = "foo"
if "bar" === a
p "bar"
elsif "baz" === a
p "baz"
else
p "Erorr"
end
# => "Erorr"
これだけだと、 "=="演算子との違いがあまりわからないと思います。
"==="演算子はクラスで実装しているものに所属しているかを比較してくれます。
わかりやすい例で、数値を色々なクラスで比較してみます
a = 0.01
if Fixnum === a
p "I'm Fixnum!"
elsif Float === a
p "I'm Float!"
else
p "I'm Error!"
end
これは同値性をみていますが、クラスごとの性質を加味して比較しています。
実は"==="演算子はメソッドであり、.===
という形でも使用できます。
ですので、左辺はメッセージのレシーバとなり、右辺はメソッド呼び出しに使用される引数となります。(.===()という形をとる)
左辺のオブジェクトによって動きが決まるということを覚えておきましょう。