原です。 > まつもと ゆきひろです. > |(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.)