File を open してほったらかしにするようなコーディングをしていると、たとえば SunOS 4.X みたいな変なシステムでびっくりできます。
stdio でファイルディスクリプタを char でもってる。だもんで、どんどんファイル開いていくと、そのうちファイルディスクリプタが負になってEBADF。
while str = File.open(name).read : end
で close を GC 任せにしたりせず、
while begin f = File.open(name) str = f.read ensure f.close end : end
とか
str = nil while File.open(name) { |f| str = f.read } : end
とか、close が保証されるようにしといた方が、無難。 *1
IO からの読み出しは毎回新たなオブジェクトを生成します。ふつうは平気ですが、意識していないとはた迷惑なプログラムが出来上がる場合があります。
400byte ほどのブロック二つを連結したものが別のバイナリファイルに入 ているかを調べるプログラムを作った時のこと。総ブロック数 400 個ほどを調べるのにスクリプトの中でループしてたら、たまにシステム全体が一分程固まったりして。メモリ足りないとはいえ、これは良くない。
必要に応じてruby-list:23467[外部]みたいなものを作る方が良いでしょう。もっと良いのはこんなことに ruby を使わないことかもしれないけど。
*1あらい: 2001-01-21 version 1.7 以降なら str = File.read(name) とかでもok