👌

[Bug #21151] StringIO が読み取り専用のメソッドでも FrozenError が発生するというバグ報告

2025/02/25に公開

[Bug #21151] IO and StringIO raise FrozenError even for read-only methods

  • StringIO が読み取り専用のメソッドでも FrozenError が発生するというバグ報告
  • 例えば StringIO#lineno は読み取り専用のメソッドなんですが #freeze しているとエラーが発生します
require "stringio"

s = StringIO.new

# no error
p s.lineno

s.freeze

# error: can't modify frozen StringIO: #<StringIO:0x00007f5c50883138> (FrozenError)
p s.lineno
  • #lineno 以外にも #close?#eof? メソッドも該当するみたいですね
  • これは内部で間接的に rb_check_frozen を呼び出しているのが原因で意図する挙動ではないみたいなのかな?
  • 対応するメソッドとしてはいかがあげられています
    • string (returns underlying String but does not mutate anything)
    • lineno
    • pos
    • closed?/closed_read?/closed_write?
    • eof/eof?
    • sync
    • pid (a dummy method but it writes nothing)
    • fileno (dummy)
    • pread (by definition does not modify state)
    • isatty/tty?
    • size/length
    • external_encoding
    • internal_encoding
  • また StringIO ではないんですが IO は『書き込み可能である必要がある』とコメントされていますねー
GitHubで編集を提案

Discussion