[#954] Rational — keiju@... (Keiju ISHITSUKA)

けいじゅ@SHLジャパンです.

23 messages 1996/10/30
[#955] Re: Rational — matz@... (Yukihiro Matsumoto) 1996/10/30

まつもと ゆきひろです.

[#968] Re: Rational 1996/10/31

けいじゅ@SHLジャパンです.

[ruby-list:954] Rational

From: keiju@... (Keiju ISHITSUKA)
Date: 1996-10-30 08:49:07 UTC
List: ruby-list #954
けいじゅ@SHLジャパンです. 

今, Rational をNumericのサブクラスとして実装しているところです. 

中間報告をします. 3件ほど問題が発生しています.

1. Numeric#abs

ドキュメント上は, absがNumericで定義されているとなっていますが,

q = Rational(-1, 2)
q.abs

を実行すると, undefined ... とメッセージされます. 

2. coerce

また, Rational.coerceは定義していません.

q = Rational(-1, 2)
-q

を実行すると (多分)

0 - q

が実行されて, coerceが呼ばれるのですが, 無限ループに陥ります. もともと
がこちらのミス(coerceが定義されていない)なのですが, 定義されていない場
合についてももうちょっと対処して下さいませ.

3. Rational.coerce 

を以下の定義にすると.

  def coerce other
    if other.type == "Float"
      return other, Float(self)
    else
      super
    end
  end

やはり, -q で無限ループに陥ります. ここでの, super は何を行なうメソッ
ドでしょうか?

ちなみに:

  def coerce(other)
    if other.kind_of?(Float)
      return other, self.to_f
    elsif other.kind_of?(Integer)
      return Rational(other), self
    else
      super
    end
  end

上記のように, Integerの対応を行なえばちゃんと動作しました. あとは,
superをこのまま残しておいて良いかどうか??

__
.........................................石塚 圭樹@SHLジャパン(株)...
------------>アドレス変わりました!! e-mail: keiju@shljapan.co.jp <----

In This Thread

Prev Next