鄭です。

前田さん、まつもとさん、お返事ありがとうございます。

# ちょっと長くなってしまいました。確認と疑問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─┘