[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