From: Shin-ichiro HARA Date: 1999-07-18T21:04:04+09:00 Subject: [ruby-dev:7360] Re: Ruby 1.3.5 原です。 > 青山です。 > そうなんですよね。したがって、論点の中心はファイルポインタの位置=ファ > イルサイズの場合の読み込みはどうあるべきかという事になると思います。 > (あるいは、EOF とは何かという事か。) うん、そうですね。しかし EOF を改めて考え直す必要はないんじゃないかな。 > > 一方、io が EOF に達している場合の read(0) は > > > > (1) 0 バイトは読み込める大きさなのだから読んだ結果 "" を返すべき > > (2) 読む前に EOF に達しているのだから nil を返すべき > > > > と、2つの考え方があって、どちらももっともでそれぞれに得する事はある > > と思います。しかし C のライブラリの慣習としては (2) だったような気がす > > るので、 > > > > io.read(0); io.read(0); io.read(0) #=> nil, nil, nil > > > > に一票入れます。 > > すでに EOF に達しているとみなす場合、EOF までを返す、length を省略した > read もやはり nil を返すべきと思われますが、いかがでしょうか。 そうでしょうか。私は EOF から EOF まで0バイトの文字列 "" があるので それを返すのはもっともな仕様だと思います。引数無し read は名前こそ read だけど、read(byte) とは全く別のメソッドであって、[ruby-dev:7357] に も似たようなのを書きましたが、 def readall s = "" while !eof? s.concat read(1024) end s end の事だと思うわけです。nil などは無しに、常に String を返すというのは最 もシンプルな仕様でしょう。「全て読む」という意味で使うのだから読んだ後 EOF であることを通知する必要はなくて、その通知は readall が内部で受 けて消化してしまうべきであると思います。 > read も nil を返すようにするならば、この案に賛成です。というか、最初の > [ruby-dev:7326] の提案がそれですね。 「この案」とは EOF での read(0) を nil とする事ですが、こちらにはあまり 確信はありません。0/0 的な不定さがあると思います。「最初の提案」とは EOF での read は nil を返すとする事ですが、こっちには先の理由で反対 です。 > (3) ファイルポインタが移動しなければ EOF には達しない > EOF に達せず、かつ文字列は返ってこない場合を、空文字列が返って来たとみ > なす案ですね。(すなわち、io.read(0); io.read(0) #=> "", "" ) ピンと来ないのですが、「EOF に達せず、かつ文字列は返ってこない場合」という 場合は考えなくて良いのでは?そんな時ってあるのかな。 とにかく EOFに達した io を read すれば "" を返し、read(0) は良くわからないけど さしあたって nil とするのが良い、というのが私の説です。