😸

[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
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
  • 期待する挙動かどうかはさておき普通にキョっとする挙動ではありますねえ
GitHubで編集を提案

Discussion