> includeはクラス/モジュールに対するものだからです.個別のオブ > ジェクトにモジュールの機能を追加したいときにはextendを使って > くださいませ. ちゃんと動作しています。 なるほど。特異メソッドはこんなふうに使うんだ。 面白い! また一つアイテム獲得です。 また、モジュール内にインスタンス変数を書けることも知りました。 結局、 extend による方法に落ち着くことにしました。 モジュールに勝手にメソッド追加できるし、アーカイバ特有のメソッドをいじ くるときは Archive クラスに触らなくても済む。 今までの解法も今後の勉強のために取っておきます。 extend の簡単な使用例が無かったので、詳しくコメントを付けたら examples ディレクトリに加えてくれればうれしいです。UNIXユーザにとって は身近な話題で、オブジェクト指向らしい問題だと思っています。 しかも、短いコードだけどメソッドチェーンやイテレータも使っているから、 簡単な例題としても悪くないのでは? cd ~/ grep -n extend /usr/doc/ruby1.3/examples/* /dev/null /usr/doc/ruby1.3/examples/rbc.rb:37: extend Exception2MessageMapper /usr/doc/ruby1.3/examples/rbc.rb:638: extend Exception2MessageMapper /usr/doc/ruby1.3/examples/rbc.rb:1013:extend BC_APPLICATION__::CONTEXT grep finished (matches found) at Fri May 28 19:17:11 で、コードの方は、 #!/usr/bin/ruby include FileTest def archive (file) #これは互換性のためだけ Archive.new(file) end class Archive def what_type raise "file #{@file} not found" unless exist?(@file) @file[-3,3].downcase == 'lzh' and return Lha @file[-3,3].downcase == 'tgz' and return Tar @file[-6,6].downcase == 'tar.gz' and return Tar `file #{@file}` =~ /lha.+archive/i and return Lha raise "file #{@file} is not an archive file." end def initialize (file) @file=file @type=what_type extend @type end def print_id puts "This file is '#{@file}'." end def delete_extracted_files @extracted_files.each { |f| File.unlink(f) if exist?(f) } end end module Lha def list `lha l #{@file}`.split (/\n/)[2..-3].filter { |l| l[46..-1]} end def extract @extracted_files=`lha xf #{@file}`.split (/\n/).filter { |l| l.split[0] } end end module Tar def list `tar tzf #{@file}`.split (/\n/) end def extract @extracted_files=`tar xzvf #{@file}`.split (/\n/) end end -- Takashi Nishimoto: g96p0935 / mse.waseda.ac.jp I love Emacs, zsh, and Linux!! See ftp://ftp.misao.gr.jp/pub/tak/README Key fingerprint = EE D7 1D 18 A9 42 C0 8A 63 E7 F2 AC 4D C7 83 6B