From: matz@... (Yukihiro Matsumoto) Date: 1999-05-18T11:59:00+09:00 Subject: [ruby-list:14369] Re: archive.rb まつもと ゆきひろです In message "[ruby-list:14367] Re: archive.rb" on 99/05/18, Takashi Nishimoto writes: |> * new以外の別メソッドを使う(現状) | |つまり、それだと Archive.new(filename) の形式では呼べないのですか? この方法だとですね. |> * Archive::newを再定義(元の定義を保存する必要あり) | |そうしたいけど、具体的にはどうすればいいのでしょうか? class Archive ... end def < * 外側のArchiveオブジェクトと内部のデコードオブジェクトを分離 | |これだけでは意味がわからないので、もっと詳しく教えてください。 こちらは class Archive TABLE = [[/\.tar$/ => Tar,]...] def new(file) for pat, klass in TABLE break if pat =~ file end /* error if klass == nil */ @decode = klass.new(file) end def list @decode.list end def extract @decode.extract end end てな感じです.これだけだとサブクラスでメソッドを自由に追加っ てわけには行きませんが,さらに delegatorパターンを使うって技 を使えば,完璧ですね.しかし,ここまで大袈裟にする必要がある のかどうかはよくわかりませんが. |「組み込みクラス」のツリーに、どのようなモジュールをインクルードしてい |るかと、そのクラスで呼出し可能なメソッド一覧を付けてくれると「とっても」 |ありがたいです。 instance_methodを使ってください. |Enumerable.methods やっても Array.methods やっても collect が見つかり |ませんでした。Array から呼出せるメソッドを全て知りたいのです。 Array.instance_method(true)を使うと呼び出せるすべてのメソッ ド名を返します. まつもと ゆきひろ /:|}