まつもと ゆきひろです
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
の方が完璧に近そうですね.おお,テンプレートクラスのようだ.
# これは宿題にしましょう.
まつもと ゆきひろ /:|)