In article <1072167374.096702.13473.nullmailer / picachu.netlab.jp>,
  matz / ruby-lang.org (Yukihiro Matsumoto) writes:

> うーん、「EOF flag 依存の挙動を無くすか減らす」というのがあ
> まりイメージできません。なにか意見がありますか。

まず、なにはともあれ read(nil) を EOF flag (feof の返り値) にかかわら
ず常に String を返すようにするのがいいと思います。

これは EOF flag の影響としてもっとも目立つところだからです。

EOF flag の影響はこれ以外には

* read(0)
* EOF flag がセットされた後にファイルが延びた場合や、端末からの入力で
  複数回 ^D を送った場合
  
があります。

前者は EOF flag の観察以外には役に立たず、誰も使わないので、変えるにし
ても最後が良いと思います。

後者は微妙で、変えるなら EOF flag がセットされるたびに clearerr するわ
けですが、特に端末に対する挙動の変化が適切かどうかは微妙な所です。した
がって、少なくとも 1.8.1 でやるのは妥当ではないでしょう。

さて、そうやって EOF flag 依存の挙動が減ると、IO モドキが実装しやすく
なるという利点があります。IO モドキというのは StringIO,
Zlib::GzipReader など、IO と同じような型を持つクラスです。

今回の EOF flag の話で判明したわけですが、IO モドキの実装が行われる場
合にはほぼ確実に EOF flag の実装は失敗します。StringIO も
Zlib::GzipReader も問題があり、さらに、IO 自身についても疑わしい所があ
ります。これは要するに IO モドキを実装しようとする人にとって仕様が理解
しにくいことを意味します。

ただ、一般に Ruby の方針として、実装を苦労してもユーザの利便性を優先す
るということがあり、仕様が(例え理解不能なほど)複雑であってもそのこと自
身は悪くないという考えもあるわけですが、EOF flag の件に関しては次の
2つの理由により、実装を簡単にするように仕様を変えたほうが適切だと思い
ます。

* EOF flag がなくてもユーザの利便性は落ちない

  以前の議論を読みましたが、(原さんの)要求は空のファイルを read(nil)
  したときに nil が返って来るのが困るというもので、この要求に応える方
  法としては EOF flag を使わなくても常に String を返すという方法があり
  ます。というか、原さんは議論の終りごろにはむしろそっちを主張していま
  した。それに対して、EOF flag を使う仕様のほうが良いという明確な理由
  は無いように思えます。唯一それらしい主張と思えるのは read(nil) は
  read(∞) だという話ですが、read(∞) だとしたら空のファイルに対して
  "" は返さないわけでそれも理由にはならないように思います。

* EOF flag が消えると IO モドキを実装する人にとって利便性は上がる

  もし IO の仕様が Ruby 本体の IO だけで実装されるのなら複雑な仕様でも
  大きな問題はありません。問題が出るたびに頭をひねって解決すればそれで
  すみます。

  しかし、IO の仕様は IO だけでなく、StringIO, Zlib::GzipReader など、
  さまざまなところで実装されます。複雑な仕様は正しい実装を難しくし、
  IO との一貫性のとれていない実装を生まれやすくします。その結果として
  オブジェクト指向の利点である多態性を損なうことになります。

  なお、StringIO, Zlib 以外のものが実際にあるかというと、例えば、坂井
  さんはなんか考えているようです
  http://web.sfc.keio.ac.jp/~s01397ms/d/?date=20031209#p02

というようなわけで、とりあえず read(nil) は常に String を返すようにす
ると良いんではないかと思うわけです。
-- 
[田中 哲][たなか あきら][Tanaka Akira]