まつもと ゆきひろです

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#== の定義を変更すれば良いのか。
ちょっと考えてみます。

                                まつもと ゆきひろ /:|)