まつもと ゆきひろです

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)