[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dennou-ruby:000092] Re: operator redefinition



ごとけんです

In message "[dennou-ruby:000091] operator redefinition"
    on 99/09/08, Takeshi Horinouchi <horinout@xxxxxx> writes:
>ところでオペレーターの定義で
>
>  self + なんとか
>
>はできるのですが、
>
> なんとか + self
>
>を定義するいい方法ないですかね。「なんとか」になりうるクラス
>で再定義するしかないんだろうか。

えっと、Numeric のサブクラスは自分の知らないオペランドをもらうと、オペ
ランドに「分かるように変換して」と頼みます。このメソッドは coerce とい
います。これだけじゃ分からんかもしれませんが、いま時間ないので、とりあ
えず例を送ります。分からんかったらまた聞いて下さい。
# 秀作も後で読みますのでしばしお待ちを!!

class Foo < Numeric
  class << self
    # Numeric に new は似合わないので new を隠す
    def [](val = 0.0)
      if val.kind_of?(Foo)
	val
      else
	new(val)
      end
    end

    private :new
  end

  def initialize(val = 0.0)
    @xxxxxx = val.to_f
  end
  attr_reader :val

  def +(other)
    if other.kind_of?(Float) || other.kind_of?(Integer)
      Foo[@xxxxxx + other]
    elsif other.kind_of?(Foo)
      Foo[@xxxxxx + other.val]
    else
      x,y = other.coerce(self)
      x + y
    end
  end

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

foo = Foo[100]
bar = Foo[200]
p foo + bar
p foo + 1
p 2 + bar
p 3.4 + foo