まつもと ゆきひろです.
In message "[ruby-list:1655] [Q] Use of '==', 'eql?' and 'hash'"
on 97/01/09, sinara / blade.nagaokaut.ac.jp <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に格納したオブジェクトが取り出せなくなります.
まつもと ゆきひろ /:|)