バリケンのRuby日記 RSSフィード

2006-10-21

[] 「たのしいRuby 第2版」の練習問題を解く(25)  「たのしいRuby 第2版」の練習問題を解く(25) - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  「たのしいRuby 第2版」の練習問題を解く(25) - バリケンのRuby日記  「たのしいRuby 第2版」の練習問題を解く(25) - バリケンのRuby日記 のブックマークコメント

(2) 引数として1つの入力用IOオブジェクトと、0個以上の出力用IOオブジェクト引数に取るメソッドteeを定義してください。このメソッドは入力用IO オブジェクトから1行ずつ入力を読み込んで、すべての出力用IOオブジェクトに同じものを出力します(出力用IOオブジェクトが0個のときは、何も出力しません)。以下のように利用することで、標準入力から読み込んだデータをそのまま標準出力に書き出すと同時に、引数で指定したファイルにもコピーします。

def tee(input, *outputs)
  ...
end

filename = ARGV.shift
open(filename, "w"){|out|
  tee($stdin, $stdout, out)
}

なお、引数の「*outputs」という書き方については「18.6 多重代入」(p.357)を参照してください。

たのしいRuby 第2版

じゃあ、ぼくの答えだよ。

def tee(input, *outputs)
  input.each_byte{|ch|
    outputs.each{|io| io.putc(ch) }
  }
end

解答例と比較してみると‥‥。考え方は一緒だけど、問題文をよく読んだら「一行ずつ」だったね。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20061021