> 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