まつもと ゆきひろです
In message "[ruby-list:16445] eql?"
on 99/09/03, Tadayoshi Funaba <tadf / kt.rim.or.jp> writes:
|Rational と 自作のもののオブジェクトを Hash に納めようとしたのですが、
|hash の値が同じになると、エラーになります。
|
|./rational.rb:203:in `<=>': undefined method `coerce' for #<Date:0x82f5c> (NameError)
うーむ、どうして Rational#<=> が呼ばれちゃうんでしょう?
たしかに Numeric#== は内部で <=> を呼んでいるのですが
(Comparableから継承している)、でもスーパークラスの
Numeric#eql? は
def eql?(other)
self.type == other.type and self == other
end
って定義になってますから、実質的に
def eql? (other) Rational === other and self == other end
と同じだと思うんですが...
あ、そうか、自作クラスの方の == の定義によっては <=> が呼ば
れちゃうかもしれませんね。なにが問題かといえば、== が例外を
出す可能性があるのがいけないんでしょうね。
となると Comparable#== の定義を変更すれば良いのか。
ちょっと考えてみます。
まつもと ゆきひろ /:|)