👌
[Bug #21151] StringIO が読み取り専用のメソッドでも FrozenError が発生するというバグ報告
[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
は『書き込み可能である必要がある』とコメントされていますねー- https://bugs.ruby-lang.org/issues/21151#note-3
- IO によっては『読み込み処理でも書き込まれることがある』とのこと
- コメントだと OpenSSL が例にあげられていました
- https://github.com/openssl/openssl/commit/b1d6e3f551ce7e081ed3e30d525253042ebb10a4
- 確かに通信系だとそういうことはありそう
Discussion