From: Tanaka Akira Date: 2003-12-23T12:56:03+09:00 Subject: [ruby-dev:22328] Re: yet another inconsistency about EOF between StringIO and IO In article <87k751dzyf.fsf@serein.a02.aist.go.jp>, Tanaka Akira writes: > まぁ、やはり EOF flag 依存は無くしたほうが幸せなんではないだろうかとも > 思いますが。不幸になる状況はあまり思いつきませんし。 EOF flag についてですが、IO#dup が EOF flag をコピーしないことに気がつ きました。 % ruby -e 'f = open("/dev/null") f.read p f.read(0) p f.read(0) p f.read(0) g = f.dup p g.read(0) p g.read(0) p g.read(0) ' nil nil nil "" "" "" StringIO では次のようにコピーされますから一貫していません。 % ruby -rstringio -e ' f = StringIO.new("") f.read p f.read(0) g = f.dup p g.read(0)' dup という名前をオブジェクトのコピーと思えば、EOF flag もコピーされる のが適切だと思います。(dup(2) だといわれると難しいところですが) ただし、ファイル位置がファイルのサイズよりも小さいときに EOF flag をセッ トするのは難しいので、やはり EOF flag 依存の挙動を無くすか減らすかして、 EOF flag が目立たないようにしたほうがいいんではなかろうかと思います。 また、dup と同様に reopen も IO のは EOF flag をコピーせず、StringIO のはコピーするという一貫しない挙動を示します。 % ruby -e 'f = open("/dev/null") f.read p f.read(0) g = STDIN g.reopen(f) p g.read(0) ' nil "" % ruby -rstringio -e ' f = StringIO.new f.read p f.read(0) g = StringIO.new g.reopen(f) p g.read(0)' nil nil ただ、reopen を open しなおすことだと思えば、この場合は EOF flag はク リアされるほうが適切なのかも知れません。 -- [田中 哲][たなか あきら][Tanaka Akira]