原です。

> まつもと ゆきひろです.

> |(1) Foo の == を再定義するとそれに合わせて eql? も再定義
> |      される様に思いますが、それは正しいですか?
> 
> それに合わせてというとちょっと違うと思いますが,eql? のデフォ
> ルトの定義は == をつかって
> 
>   def eql?(other)
>      self == other
>   end

そうでしたか。


> |(2)ここで(しかたなく) @a と @b を attr で公開しましたが、
> |     公開しないでこの eql? と同様なものは作れるでしょうか?
> 
> 現状では普通にはできません.ちょっとひねれば
> 
>   def eql? other
>     other.check_eq? @a, @b
>   def
>   def check_eq? a, b
>     a == @a and b == @b
>   end
> 
> とかいう実装が考えられます.

そんな方法があったとは!


> |(3)eql? を再定義したので hash も再定義すべきですが、
> |     この例ではどのようにすればよいでしょうか?
> 
> a.eql? bの時,a.hash == b.hashであればなんでもかまいません.
> たとえば,
> 
>   def hash
>     @a.id ^ @b.id
>   end
> 
> なんかどうでしょう.

ん?そんな大雑把でいいの?と思ったら、


> |(4)eql? を再定義したのに hash は再定義しなかった場合、
> |    どういう局面で不具合がありますか?
> 
>   a.hash == b.hash and not a.eql? b
> 
> が成立するとHashに格納したオブジェクトが取り出せなくなります.

まずい質問でしたが、聞きたかったのはそういうことです。
つまり Hash のキーの一致は

   a.hash == b.hash and a.eql? b

で見ているのですね。hash の値で候補をしぼり、eql? で確認する
という感じでしょうか?
---===-=-=-=-=-=-=-=-=======--=-=-=-==-=-===-=-=-=-=-=-=--=-==-=--
                            Shin-ichro Hara(Nagaoka Univ.of Tech.)