けいじゅ@日本ラショナルソフトウェアです.

In [ruby-math:00762] the message: "[ruby-math:00762] Re: hash of
Rational", on Aug/15 18:34(JST) IKEGAMI Daisuke writes:

>いけがみです。

>Rational だと、reduce してから hash をとらないと同一性が保証できませ
>ん。

正確には同一性ではないですね. 同値性でもないし, 何と呼ぶべきでしょうね...
それはともかく

>現在の Rational でも、 eql? で true を返すのに hash が異なっています。

というかですね...

>irb(main):002:0> a = Rational.new(1, 2)
>Rational(1, 2)
>irb(main):003:0> b = Rational.new(2, 4)
>Rational(2, 4)

を使わないでください. Rational(1,2)を使ってください. Rational.newは内
部的にのみ用いるメソッドです.

# Rational.newをプライベートにしたほうがよいかな... それか, ruby-1.7で
# はRational.new!でallocateを使うようにするか... 

Rationalはすべての演算のあとで約分しているので, hashに関しては, 上記の
例外を省けば問題ないはずです.

PS.
あと, リファレンスマニュアルですがNumeric#eql?の定義を追加した方が良い
のでは? Object#eql?とは違っていますので. 案:

2つのオブジェクトのクラスが等しくかつ値が等しい時に真を返します.

__
..............................石塚 圭樹@日本ラショナルソフトウェア...
----------------------------------->> e-mail: keiju / rational.com <<---