From: matz@... (Yukihiro Matsumoto) Date: 1997-01-09T17:15:52+09:00 Subject: [ruby-list:1656] Re: [Q] Use of '==', 'eql?' and 'hash' まつもと ゆきひろです. In message "[ruby-list:1655] [Q] Use of '==', 'eql?' and 'hash'" on 97/01/09, sinara@blade.nagaokaut.ac.jp writes: | |原です。 | |Hash で使われるメソッド hash について質問です。 |(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に格納したオブジェクトが取り出せなくなります. まつもと ゆきひろ /:|)