まつもと ゆきひろです
In message "[ruby-list:8426] Re: how to use delegate"
on 98/06/19, GOTO Kentaro <gotoken / math.sci.hokudai.ac.jp> writes:
|ごとけんです
|>あ,でもこの場合,メソッドの再定義が出来ないので,無名のクラ
|>スを生成する関数を用意して
|>
|> class FakeArrray<DelegateClass(Array)
|> ...
|> end
|>
|>の方が完璧に近そうですね.おお,テンプレートクラスのようだ.
|># これは宿題にしましょう.
|
|やるべきことが理解したつもりですが、殴り書きしたのが
|すぐには動きそうに無い雰囲気なので(^^;; 週末の宿題に
|させて頂きます (^^;;;
教育的見地から効果的かどうかは分かりませんが,^^;;;
[ruby-list:8425]に刺激されて書いてしまいましたので,解答とし
ます.
def DelegateClass(superclass)
klass = Class.new
methods = superclass.instance_methods
methods -= ["__getobj__","to_s","nil?","to_a","hash","dup","==","=~"]
klass.module_eval <<EOS
def initialize(obj)
@obj = obj
end
EOS
for method in methods
klass.module_eval <<EOS
def #{method}(*args, &block)
begin
@obj.__send__(:#{method}, *args, &block)
rescue
$@[0,2] = nil
raise
end
end
EOS
end
return klass;
end
class ExtArray < DelegateClass(Array)
def initialize(data)
super(data.clone)
end
end
temp = [1, 3, 2, 5, 4]
data = ExtArray.new(temp)