==, eql?, equal?
==とeql?は値が等しいかどうかを調べます。これらはクラスごとに再定義し「そのクラスにおける等しさ」の意味を決めます。数学でいう同値関係になることが期待されると想像しますが、Rubyリファレンスマニュアルにはそこまでは言及されていないようです。
eql?はハッシュのキーの同一性判定に用いるので、eql?を再定義する際にはオブジェクトのハッシュ値を返すhashメソッドも再定義する必要があります。
equal?は同じオブジェクトかどうかを調べます。これは再定義しません。同じオブジェクトというのは、object_idが等しいオブジェクトのことだと想像します。オブジェクトのアイデンティティはそこにあるからです。
x = [4, 5] y = [4, 5] a = [1, 2, 3, x] b = [1, 2, 3, y] p a == b #=> true p a.eql?(b) #=> true p a.equal?(b) #=> false