鄭です。 前田さん、まつもとさん、お返事ありがとうございます。 # ちょっと長くなってしまいました。確認と疑問1件と、core dump 1件です。 Yukihiro Matsumoto writes: > まつもと ゆきひろです > > In message "[ruby-list:7012] Re: builtin class inherit" > on 98/03/08, Shugo Maeda <shugo / po.aianet.ne.jp> writes: > > |前田です。 > > ||こういう場合どうするのが ruby の御作法なのでしょう? > | > |継承するのはやめてDelegatorを使うというのはどうでしょう。 delegate.rb を読んでみました。 initialize の中で、渡された object が持つ メソッド群 と同名の メソッド群を 自分(これからできるインスタンス?)に 特異メソッドとして宣言(作成)していく クラスだろうと理解しました。 なるほど...。 この delegate.rb の手法は、オブジェクト指向プログラミングでは一般的な 手法なのでしょうか? それとも、delegate.rbは ruby の「組み込みクラスでインスタンス変数が 使えない制限」を回避するのを主目的に用意された物なのでしょうか? ところで、、ひとつ疑問が有ります。 (なかなか、この疑問の連鎖がおわらない ^_^;) delegate.rbの末尾の p foo.type # => Object のあとに p foo.singleton_methods p foo.methods を付け加えて、実行して見たのですが、 singleton_methods の方が 空でした。 initialize の中の eval "def self.#{method}(*args); __getobj__.send :#{method}, *args; end" は、なぜ特異メソッドにならないのでしょうか? 試みに、以下のスクリプトを実行してみたのですが、 class Foo def initialize(tag) eval "def hoge0_#{tag}; print \"do hoge0 #{tag}\n\"; end" eval "def self.hoge1_#{tag}; print \"do hoge1 #{tag}\n\"; end" end end SELECT = ["hoge0_F1", "hoge1_F1", "hoge0_F2", "hoge1_F2" ] f1 = Foo.new("F1"); print "Make f1\n" print " f1 singleton_methods -- "; p f1.singleton_methods.sort print " f1 methods -- "; p ((f1.methods & SELECT).sort) f2 = Foo.new("F2"); print "Make f2\n" print " f1 singleton_methods -- "; p f1.singleton_methods.sort print " f1 methods -- "; p ((f1.methods & SELECT).sort) print " f2 singleton_methods -- "; p f2.singleton_methods.sort print " f2 methods -- "; p ((f2.methods & SELECT).sort) 以下のようになって、eval "def self.hoge1_ ……" はちゃんと特異メソッドに なったのですが。 % ruby /tmp/tokui.rb Make f1 f1 singleton_methods -- ["hoge1_F1"] f1 methods -- ["hoge0_F1", "hoge1_F1"] Make f2 f1 singleton_methods -- ["hoge1_F1"] f1 methods -- ["hoge0_F1", "hoge0_F2", "hoge1_F1"] f2 singleton_methods -- ["hoge1_F2"] f2 methods -- ["hoge0_F1", "hoge0_F2", "hoge1_F2"] # それにしても、eval "def hoge0_ ……" の方は、インスタンスが # 出来る度に、クラス定義にメソッドを追加してしまう結果になるのですね… # さすが、インタプリタ … > その通りです.サンプルとしては > > lib/tempfile.rb > > があります. これも理解するために動かして見ようとしたら、、、 % ruby /usr/local/lib/ruby/tempfile.rb /usr/local/lib/ruby/final.rb:35: [BUG] Segmentation fault zsh: IOT instruction (core dumped) ruby /usr/local/lib/ruby/tempfile.rb コアダンプしてしまいました。^_^;; -- ┌─鄭 明毅───────────────────┐ └──tei / harmony.co.jp──tei@mirage.linc.or.jp─┘