IO
から指定したバイト数以内の長さを読み込みたいが、多バイト文字の途中で切れてしまうのは嬉しくないのでそういうときはもう少し読む、というような処理を書きたいことがよくある。
これ、というメソッドは見当たらないので仕方がないから自前でバッファリングしたりしてなんとかしていたのだけど、 IO#gets
にそういう機能があることが分かった。
IO#gets
はseparatorに nil
を指定するとseparateせずにファイルの最後まで読む。それからもう1つ、読み込むバイト数の上限を指定できる。この上限指定は1.9ではもちろん多バイト文字を壊さないようになっている。だからこれらを組み合わせて io.gets(nil, limit)
とすると希望の動作をする。行操作でもないのに gets
というのはちょっと思いつかないね。
余談
なぜ突然こんなのに気づいたのかというと、今書いているライブラリの関係で IO
の挙動を細かくみているのだ。
IO
クラスはもともと結構大きなクラスだったのだが、Ruby 1.9になってM17Nが入ったためにエンコーディングがらみでさらに挙動が複雑になった。もはや StringIO
みたいに自前で IO
もどきのクラスを書くのは容易ではない。そこで IO
もどきを作るのを助ける IOable というライブラリを書いている。