まつもと ゆきひろです
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!(/&/, "&")
arg.gsub!(/</, "<")
arg.gsub!(/>/, ">")
end
@out.print(*new_args)
end
public :print # print は privateなので変更する
# 知らないメソッドを@outに委譲する
def method_missing(id, *args)
@out.send(id, *args)
end
end
というのが良いのではないかと思います.
まつもと ゆきひろ /:|)