さかいといいます。

From: nobu.nakada / nifty.ne.jp
Date: Wed, 10 Dec 2003 18:17:58 +0900

> なかだです。
> 
> At Wed, 10 Dec 2003 17:24:33 +0900,
> Tanaka Akira wrote:
> > なんかまだ微妙に違います。
> 
> 合わせました。他に何かありますか。

IO#eof?がEOFフラグへの副作用を持つのに対して、
StringIO#eof?はEOFフラグへの副作用を持たない
という違いがあるようです。

% echo -n > 0
% ruby -e 'f = File.open("0")
p f.read'
""
% ruby -e 'f = File.open("0")
f.eof?
p f.read'
nil

% ruby -rstringio -e 'f = StringIO.new
p f.read'
""
% ruby -rstringio -e 'f = StringIO.new
f.eof?
p f.read'
""

述語が副作用を持つのは直観に反するので、
IO#eof?をStringIO#eof?に合わせるのがよいと思います。

Index: io.c
===================================================================
RCS file: /src/ruby/io.c,v
retrieving revision 1.241
diff -u -p -r1.241 io.c
--- io.c	10 Dec 2003 08:26:31 -0000	1.241
+++ io.c	11 Dec 2003 12:16:55 -0000
@@ -568,6 +568,7 @@ rb_io_eof(io)
 	ungetc(ch, fptr->f);
 	return Qfalse;
     }
+    clearerr(fptr->f);
     return Qtrue;
 }
 

--
酒井 政裕 / Masahiro Sakai