まつもと ゆきひろです

In message "[ruby-list:8420] Re: how to use delegate"
    on 98/06/19, GOTO Kentaro <gotoken / math.sci.hokudai.ac.jp> writes:

|ごとけんです

|なるほど。つまり型を完全に偽ることはできないのですね。

そうですね.嘘はほどほどに.
# あれ? でもkind_of?も転送されるんじゃないかなあ.

|>  (1) delegate.rbを参考にオブジェクトではなくクラスを定義す
|>      るライブラリを作る
|>
|>  (2) 必要に応じてfoo2をcloneする(プロトタイプベースだ)
|>
|>ということが考えられます.
|
|(1) を検討してみたいのですが、delegate.rb 中の
|__send__ と言うのが分りません。
|Object#send と同じモノでしょうか?

そうです.sendはSocketなどで再定義されているので,こういう名
前の別名を持ってます.

|それと、確認したいのですがクラス版のdelegatorを作る
|場合、適当な機能を持った Class のインスタンスを
|返すモノを書くと理解して良いのでしょうか? 

あー,ちょっと待って下さいね….

多分,こういうのがよろしいんじゃないかと思います.

  class FakeArrray<DelegateClass
    mimic(Array)
    ...
  end
  a = FakeArrary.new([1])

とするとこんな感じでないでしょうか.

class DelegateClass
  def initialize(orig, *args)
    @obj = orig
    super(*args)
  end
  def DelegateClass.mimic(klass)
    methods = klass.instance_methods
    methods -= ["__getobj__","to_s","nil?","to_a","hash","dup","==","=~"]

    for method in methods
      self.module_eval <<EOS
      def #{method}(*args, &block)
	begin
	  @obj.__send__(:#{method}, *args, &block)
	rescue
	  $@[0,2] = nil
          raise
	end
      end
EOS
    end
  end
end

あ,でもこの場合,メソッドの再定義が出来ないので,無名のクラ
スを生成する関数を用意して

  class FakeArrray<DelegateClass(Array)
    ...
  end

の方が完璧に近そうですね.おお,テンプレートクラスのようだ.
# これは宿題にしましょう.

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