ふなばです。 At 1999-09-03T11:11:52+0900 (2451424.59157JD), matz / netlab.co.jp (Yukihiro Matsumoto) wrote: matz> うーむ、どうして Rational#<=> が呼ばれちゃうんでしょう? matz> たしかに Numeric#== は内部で <=> を呼んでいるのですが matz> (Comparableから継承している)、でもスーパークラスの matz> Numeric#eql? は matz> def eql?(other) matz> self.type == other.type and self == other matz> end matz> って定義になってますから、実質的に matz> def eql? (other) Rational === other and self == other end matz> と同じだと思うんですが... みてみると、Ruby のプリミティブな型の検査のあと、生の値の比較を試みて から、== を呼んでいるような。 どこが責任持つかは別として、eql? において、上のような検査が必要なことは 確かなんですよね。とすれば、date[23]? でも、そのような変更をしなければ いけないのかな。 matz> あ、そうか、自作クラスの方の == の定義によっては <=> が呼ば matz> れちゃうかもしれませんね。なにが問題かといえば、== が例外を matz> 出す可能性があるのがいけないんでしょうね。 matz> となると Comparable#== の定義を変更すれば良いのか。 matz> ちょっと考えてみます。 んー、よくわかっていないかもしれないんですが、問題は型の検査がされてい ない、 つーことなのでわ? あっさり例外だしちゃまずい、ってのはあると思 うのですが。 ふなば ただよし