From: Wakou Aoyama Date: 1999-07-21T15:33:22+09:00 Subject: [ruby-dev:7388] Re: Ruby 1.3.5 青山です。 Wed, Jul 21, 1999 at 02:19:48PM +0900 において Yukihiro Matsumoto さん曰く: > 「read()とread(n)を別のメソッドとしてみなす」というのは理解 > できます。が、「read()がEOFで""を返すことの利便性」ってのは > よく理解できてません。便利なの? > > 「めったにないことだから(2度目のread()の時にしか発生しない)どっ > ちでも良い」というのは良く理解できるんですが。 現在の eof? の実装では、長さ 0 のファイルに対して read() が "" を返す ようにする事と、EOF で "" を返す事は同時にしかできなかった為の案です。 ところが、ちょっと試しに手元で feof(3) を使って eof? を書き換えてみる と、それだけでこうなるんですね。 io.stat.size # 0 io.read # "" io.eof? # false io.read # "" io.eof? # false io.read(0) # nil io.eof? # false io.read(0) # nil io.eof? # false io.read(1) # nil io.eof? # true つまり、read() と read(0) は決して EOF に達しないわけです。なるほど。 という事で、feof(3) を使用した場合には長さ 0 のファイルでも "" と EOF に達した場合には nil というのを同時に実装できるようですが、いかがでしょ うか?>原さん read() も EOF で nil を返すが、read() 自体は決して EOF には達しない。 read(n) によって EOF に達していた場合には、read() も nil を返す。 という感じです。eof? を feof(3) にしただけの場合。 ちょっとややこしいですから、read() にも手を加えて、read() 後は EOF に 達しているようにしてしまうといいかもしれないですね。内部で最後に read(1) でもしておくとか。 すると、read() は、無限大の n を与えられた read(n) のような挙動になり ます。 > 現時点ではread(0)は""を返すべきだと思ってます。EOFを検出した > 後は nil になるかも。 私も賛成です。(というか、これが現在の eof? ではできなかった為の議論だっ たわけですが) -- 青山 和光 Wakou Aoyama