From: Wakou Aoyama Date: 1999-07-23T00:03:35+09:00 Subject: [ruby-dev:7396] Re: Ruby 1.3.5 青山です。 Thu, Jul 22, 1999 at 06:04:50PM +0900 において Shin-ichiro Hara さん曰く: > これに賛成!(^^;; と、いうか EOF に達しているけど、eof? は false > であることを許す、といったらいいのかな。(つまり必ずしも eof? > は EOF にポインタが来ていることを表さない。)EOF という言葉が > いろんな意味で使われてごちゃごちゃになってますね、、、 そうなんですよね。EOF というデータは存在しない。存在しないものにポイン タが来る事はありえない。しかし、語感から、データの最後の位置というポイ ントを示すように受け取られている。ややこしいです。 EOF を表示するエディタがありますが、ポインタとして考える場合は、あのよ うに、EOF というのはファイルの末尾ではなく、末尾 + 1 のように見ると近 いようにも思われます。 > すなわち、eof? は > > 直前の1バイト以上の読み込みで読み込み終了になった場合 ture、 > そうでないとき false。 > 直前に1バイト以上の読み込みをしてない場合は不定(か true)。 > > みたいに正式に定義してしまうのが良い、と思うようになりました。 そうですね。このようにポインタから離れた定義をドキュメントにも書いてし まうのが良さそうですね。 ただし、その定義としては「直前の」ではなく、「過去に」のようです。 過去に読み込みに失敗した事がある場合 true read() や read(n) はエラーをトラップしてしまっているので表面化しません が、上記の「読み込み終了」にあたる部分は、本当は EOFError が発生した場 合です。 $ /usr/src/ruby/ruby -e 'io = open("0"); p io.stat.size p io.eof? p io.sysread(1024) p io.eof? ' 0 false /tmp/rbXBKqfG:3:in `sysread': End of file reached (EOFError) from /tmp/rbXBKqfG:3 これをたまたま read では 0 バイトより大きなデータが得られた場合には返 さないようにしているだけで、もしかすると、read の方のドキュメントに問 題があるのかもしれないですね。 単に EOF で nil を返します。ではなく、1バイトも得られず EOFError が発 生した場合には nil を返します。とか。実装もこうなっているわけですし。 > さて、read(0) の返り値についてですが、私は > > io.read(0) は io の状態にかかわらず常に nil を返す > > を提案します。これは私の最初の提案なんだけど、理由はちょっと変わって > > "read(2)" では read(,,0) の返り値は 0 としている > > からです。 > > これでいえば、0バイトファイルは read(0) は nil だけど eof? は > false なわけです。(どちらを何回やっても。) > > さらにこの際、「"read(2)" が 0 を返す場合は Ruby の read(n) も nil > を返す」ことにしちまったらどうでしょう。 そうですね。ドキュメントに明記すれば、これでもいいと思います。 > 一方、残る問題 read() ですが、0バイトファイルに read() を2回 > したとき、 > > (1) "", "" > (2) "", nil > > のどっちにするかですね。つまり > > (1a) read() は read(n) と全く違うものと思う > (2a) read() は read(n) と類似と思う > > の違いです。私は (1a) を推しています。0バイトファイルに対して > 1回目の read() が "" であるのに read(0) は nil なので、read() > と read(n) が類似とはいえないから、というのが一つの論拠です。 あ、なるほど。上記の read(0) を採用すると (1) になるわけですね。 しかし、実はそれ以前に read は EOFError を隠しているという面があります ので、read(0) も含めて (2) 案というのもありかもしれません。 これは、セットになるでしょうか。read(0) の扱いしだい。 -- 青山 和光 Wakou Aoyama