[#1058] ruby 0.99.3-961119 available — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです.

19 messages 1996/11/19
[#1059] segm fault (Re ruby 0.99.3-961119 available) — sinara@... 1996/11/19

原です。

[ruby-list:1087] Re: bug report (>>)

From: matz@... (Yukihiro Matsumoto)
Date: 1996-11-25 00:40:54 UTC
List: ruby-list #1087
まつもと ゆきひろです

In message "[ruby-list:1082] Re: bug report (>>)"
    on 96/11/24, Yukihiro Matsumoto <matz@caelum.co.jp> writes:

||[3] Fixnum.div(Bignum)
||
||状況がいささか複雑なのですが... バグというかトラブルっています. ちょっ
||と助けて下さい.
|
|むむむ,状況はわかりました.説明すると非常にややこしいのです
|が,基本的にはaliasされても,もともとの名前を覚えているのが
|原因です.つまり,divが呼ばれてから(aliasされているので) / 
|が呼ばれ,coerceした時に変換後のオペランドに対して(divでなく)
|/ を実行しようとしますが,/ は rdivに置き換えられている訳で
|す.かなり,ややこしい状況ですが,どうあるべきか深く考えてみ
|ます.

考えてみました.要はcoerce後,(変換された)自分に対して,再計
算のために / を呼び出すのだが,/ は既に置き換えられていて,
本当に呼び出したいのは divになっているというのが問題の原因で
すよね.いろいろ考えたのですが,coerceの現在の仕組みを変える
訳にはいかないので,石塚さんの選択肢としては

  * /を再定義する際に,coerceの仕組みを含めて再定義する
  * 1 / 2 ->1/2を返す演算子は別の名前にする

のいずれかでしょう.多分後者は嬉しくないでしょうから,前者に
ついて説明すると

  class Fixnum
    alias div / #/
    def / (other)
      if other.type == "Fixnum"
        return Rational.new(this,other)
      end
      x, y = other.coerce(this)
      return x.div y
    end
  end

のような感じになるのではないでしょうか(テストしていません).
この場合,再定義する / の定義を調べて,coerceせずに計算でき
ることが確かな引数で div を呼び出すのが,肝心です.

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

In This Thread

Prev Next