トップ «前の日記(2007-08-16) 最新 次の日記(2007-08-18)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2007-08-17

_ Ruby.NET

どんどこ動き出しているのであせりまくる。

と、忘れないようにメモ。

_ File#each_line

良く次のように書いて、ファイルがオープンされているよエラーとなって悲しくなることがある。
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つ。無意味な変数も使わないで済む。実にスマートだ。(例外処理が必須な場合は話は別)

本日のツッコミ(全5件) [ツッコミを入れる]
_ naruse (2007-08-17 06:07)

IO.foreach はいかがですか。

_ arton (2007-08-17 08:59)

おお、こんなのがあるんですね。ensure付きなのか。<br>でも待てよ。'rb'は指定できるのかな? とか、細かいところが気になるので、例外処理が必要な場合には使いそうだけど、基本はFile#each_lineかなぁ。

_ 通りすがり (2007-08-17 09:25)

るびまではちょうどその話題で、 「IO.readlines を使ったほうがいいと思う。 」とかかれています。<br>http://jp.rubyist.net/magazine/?0020-Hotlinks(の脚注)

_ arton (2007-08-17 09:37)

お、どうも。そういえば、何かでeach_lineだとファイルを閉じないとか書いてあるのを見た(かつ、経験ある)と思ったら、るびまだったんですね。鳥のように空を飛べるといいのに。<br>っていうか、readlinesは富豪過ぎじゃないかな(と言いながら、readで一気読みとか良くするんだけど、ケチをつけたくなるのは、そこに腐臭を嗅ぎ取ってるからが60%、単にいつもの手順を変えたくない保守的な心情が40%)、という以上にブロックを2重にしないと処理できなくていやだな。

_ arton (2007-08-17 11:01)

上の最後の行は何かの間違い。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|

ジェズイットを見習え