前回作った劣化版 tail コマンド
id:seiunsky:20070419:1176997597
通勤途中で読んでいる
Rubyist Magazine 出張版 正しいRubyコードの書き方講座―RubyistのRubyistによる、Rubyistとそうでない人のための
- 作者: 青木峰郎
- 出版社/メーカー: 毎日コミュニケーションズ
- 発売日: 2007/03
- メディア: 単行本
- 購入: 1人 クリック: 81回
- この商品を含むブログ (62件) を見る
この本の中で、open に対する close 処理で、 close 処理を書くのがダルいのでブロック構文で自動的に閉じるようにした、という文章がある。
で、それをみていて、「うんうん、なるほどねー」とフツーに読み飛ばしそうになっていたんだけど、それってこの前の 劣化版 tail にも当てはまるんじゃね? と思いついた(最初に気が付いてろよ)。
というわけで、
ブロック構文でファイルを open させることで、終了時には Ruby 側(っていうのか?)で終了してもらうように修正したのでファイルの close で悩む心配はなくなった。
劣化版 tail (改良版)
こんな感じになった。
#!/usr/bin/ruby def set_signal_handler trap(:INT) { exit 0; } end def usage puts "wrong arguments..." puts "ex) %rtail filename" end set_signal_handler unless ARGV[0] && FileTest.file?(ARGV[0]) usage exit 1 end File.open(ARGV[0], "r") { |file| loop do if file.gets print $_ else sleep 1 end end }
ついでに、実際にファイルがあるかどうかも判定するようにした。こういう構文で良いのかよくわかってないけど。
それにしても、自分で書いておいてなんだけど、ファイル名があるかどうかの判定部分がわかりにくいな。
unless ARGV[0] && FileTest.file?(ARGV[0])
この部分の unless だけど、 unless って一つだけだと良いんだけど、複数の評価式が並ぶと頭が混乱する(´Д`)