まつもと ゆきひろです

In message "[ruby-list:4198] FilterOutputStream"
    on 97/09/08, TAKAGI Hiromitsu <takagi / center.nitech.ac.jp> writes:
|
|バグの話は ruby-dev へ なのでしょうが、
|使い方の問題でもありそうなのでこちらに。
|
|Java でいう FilterOutputStream のようなことをしようとして以下のように
|書いてみました。IO のサブクラスを作って print を override してみた
|わけです。ところが
|
|./test.rb:17: [BUG] Segmentation fault
|Abort
|
|となります。
|IO をサブクラス化してるあたりがいかんのでしょうか。
|new で superclass の new が呼ばれている?? かなにか?

ええと,まずIO#newにバグがありました.

次にIOについて若干説明が必要です.

  IO#newはinitializeを呼びません

  IOのサブクラスは組み込みクラスなのでインスタンス変数を持て
  ません.

  printはスーパークラスでprivateなので,再定義するとprivate
  のままになります.メソッド形式で呼び出したい場合には明示的
  にpublicにする必要があります

よって,意図通りには動かないのではないでしょうか.

この場合には

  class HtmlOutputStream
      def initialize(out)
          @out = out
      end
      def print(*args)
          new_args = args.dup
          new_args.each do |arg|
              arg.gsub!(/&/, "&amp;")
              arg.gsub!(/</, "&lt;")
              arg.gsub!(/>/, "&gt;")
          end
          @out.print(*new_args)
      end
      public :print        # print は privateなので変更する

      # 知らないメソッドを@outに委譲する
      def method_missing(id, *args)
        @out.send(id, *args)
      end
  end

というのが良いのではないかと思います.

                                まつもと ゆきひろ /:|)