著作一覧 |
File.open('foo', 'r').each_line do |line| ... end
なんとなく、次の書き方に似ているのでcloseしたつもりになってしまうからだ。
File.open('foo', 'r') do |foo| s = foo.read ... end # File.openのブロックを抜けるため、closeされる。
でも、File#each_line(実際にはIO#each_line)は、テキスト処理にはすさまじく便利なので使わないわけにはいかない。
そこで、次のように書いてみたり。
File.open('foo', 'r') do |foo| foo.each_line do |line| ... end end # File.openのブロックを抜けるため、closeされる。
2重ブロックは不格好だな。
あるいは、
foo = File.open('foo', 'r') foo.each_line do |line| ... end foo.close
くだらない変数が必要になって、ますます不格好だ。
そこで、リファレンスを見ると、IO#each_lineはselfを返すって書いてあるじゃん。なんだ、そうだったのか。
したがって、次のように書けばOK。
File.open('foo', 'r').each_line do |line| ... end.close
ブロックは1つ。無意味な変数も使わないで済む。実にスマートだ。(例外処理が必須な場合は話は別)
ジェズイットを見習え |
IO.foreach はいかがですか。
おお、こんなのがあるんですね。ensure付きなのか。<br>でも待てよ。'rb'は指定できるのかな? とか、細かいところが気になるので、例外処理が必要な場合には使いそうだけど、基本はFile#each_lineかなぁ。
るびまではちょうどその話題で、 「IO.readlines を使ったほうがいいと思う。 」とかかれています。<br>http://jp.rubyist.net/magazine/?0020-Hotlinks(の脚注)
お、どうも。そういえば、何かでeach_lineだとファイルを閉じないとか書いてあるのを見た(かつ、経験ある)と思ったら、るびまだったんですね。鳥のように空を飛べるといいのに。<br>っていうか、readlinesは富豪過ぎじゃないかな(と言いながら、readで一気読みとか良くするんだけど、ケチをつけたくなるのは、そこに腐臭を嗅ぎ取ってるからが60%、単にいつもの手順を変えたくない保守的な心情が40%)、という以上にブロックを2重にしないと処理できなくていやだな。
上の最後の行は何かの間違い。