ささだです。

 ちょっとだけ気になったんですが、$_ に入る値がちょっと不ぞろ
いな気がしました。


##############################
# テストコード
while line = DATA.gets
  p line
end
print 'DATA.gets: '
p $_

require 'stringio'
data = StringIO.new(<<EOS)
B1
B2
EOS

while line = data.gets
  p line
end
print 'StringIO#gets: '
p $_

__END__
A1
A2
##############################
# 出力 =>
"A1\n"
"A2\n"
DATA.gets: "A2\n"       ## 最後の行を出力
"B1\n"
"B2\n"
StringIO#gets: nil      ## nil になってる


 rb_lastline_set を使ってるところを grep してみると、

static VALUE
rb_io_gets_m(argc, argv, io)

(つまり、IO#gets)だけ、

    if (!NIL_P(str)) {
        rb_lastline_set(str);
    }

にしているようです。ほかの gets なんとかは無条件で rb_lastline_set
を呼んでいる、という感じのようです。gsub とかその辺は見てませんが。


 統一したほうがいいと思うんですが、私にはどっちがいいのかよ
くわかりません。すでに議論が済んで、この仕様になっていたらす
みません。


 私は $_ なんて使わないんでどうでもいいっちゃいいんですが。
(スコープローカルな変数の面倒見ると、スコープ初期化が数サイ
クル遅くなる・・・)

-- 
// SASADA Koichi at atdot dot net
//