ふなばです。

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> ちょっと考えてみます。

んー、よくわかっていないかもしれないんですが、問題は型の検査がされてい
ない、 つーことなのでわ?  あっさり例外だしちゃまずい、ってのはあると思
うのですが。

ふなば ただよし