😸
[Bug #21260] 意図せず StringIO#dup したオブジェクトに副作用が発生するバグ報告
[Bug #21260] duping stringio objects shares cursors
-
StringIO#dupしたときに元のオブジェクトのcursor位置が変わると#dupしたオブジェクトにも影響があるというバグ報告
require "stringio"
s1 = StringIO.new("test")
s2 = s1.dup
pp s1.pos #=> 4
pp s2.pos #=> 4
# 元のオブジェクトの方で読み込む
pp s1.read #=> "test"
# そうすると dup したオブジェクトの位置も変わってしまう
pp s1.pos #=> 4
pp s2.pos #=> 4
- 逆に
#dupしたオブジェクトの方で#readすると元のオブジェクトの位置も変わってしまう
require "stringio"
s1 = StringIO.new("test")
s2 = s1.dup
pp s1.pos #=> 4
pp s2.pos #=> 4
# #dup したオブジェクトの方で読み込む
pp s2.read #=> "test"
# 元のオブジェクトの位置も変わってしまう
pp s1.pos #=> 4
pp s2.pos #=> 4
-
IO#dupの場合でも同様の動きをするみたいですね
f = File.open('test.rb')
f2 = f.dup
p f.pos # => 0
p f2.pos # => 0
f.read 4
p f.pos # => 0
p f2.pos # => 4
- 期待する挙動かどうかはさておき普通にキョっとする挙動ではありますねえ
Discussion