Rubyの == と equal? と === と eql? のまとめ

==

数値、文字列、配列などで、「等しいかどうか」「同じ内容かどうか」を調べるのに使います。別のオブジェクト(別のインスタンスへの参照)でも同じ内容ならtrueになります。

Rubyでは数値と文字列の間の自動変換は行われませんので、1 == "1"はfalseです。整数と浮動小数点数の間では自動変換が行われ、1 == 1.0はtrueになります。

自作のクラスのオブジェクトどうしを ==で比較したいときは、==メソッドを定義します。==を定義しないと、equal?と同じく「同じオブジェクトかどうか」になります。

equal?

常に「同じオブジェクトかどうか」を調べるのに使います。自作のクラスでequal?を定義してはいけません(定義できてしまいますが)。

Javaでは、Stringなどのequalsメソッドは「同じ内容かどうか」を調べるもので、Rubyと逆です。

===

case式で値をテストするのに使われます。case a ; when b とするとb === aが評価されます。通常は==の結果と同じですが、Module、Range、Regexpでは別の意味になります。

===はEnumerable#grepでも使われます(ここ忘れないこと>俺)。

===を直接使うことはありませんが、Module、Range、Regexpで使うのはありかな?(is_a?やkind_of?のかわりに String === obj とするとか)。自作のクラスで===を定義することはほとんどないでしょう。

ちなみに、PHPでは 1 == "1"は真、1 === "1"は偽、のように===は「等しく型も同じ」を調べるのに使います。JavaScriptも同様。

eql?

ハッシュの中で「ハッシュのキーとして同じかどうか」を調べるのに使われます。eql?を直接使うことはありません。

自作のクラスでは、「内容が同じならハッシュでは同じキーとして扱ってほしい」ときはeql?を定義します。eql?の定義のしかたは、オライリーの『プログラミング言語Ruby』p232に詳しい解説があります。