Skip to content

Commit bc8fbae

Browse files
Watson1978claude
andcommitted
readonly? で IO::Buffer.for のブロックの有無による違いを説明する
ruby/ruby#18062 (マージ済み) で IO::Buffer#readonly? の rdoc が明確化された のに合わせる。従来の記述は「IO::Buffer.for で作ったバッファ」とだけ書いており、 ブロックを渡した場合に読み取り専用にならない点が抜けていた。 実機 (3.1.6 / 3.2.11 / 3.4.10 / 4.0.6 で同じ) の挙動: IO::Buffer.for("test").readonly? # => true IO::Buffer.for("test") { |buf| buf.readonly? } # => false IO::Buffer.for("test".freeze) { |buf| buf.readonly? } # => true IO::Buffer.new(4).readonly? # => false ブロックなしの場合は内部で作った文字列の複製を元にするため、元の文字列が freeze されていなくても常に読み取り専用になる。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent c01ed72 commit bc8fbae

1 file changed

Lines changed: 15 additions & 4 deletions

File tree

manual/api/_builtin/IO__Buffer.md

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -448,12 +448,23 @@ p IO::Buffer.new(4).external? # => false
448448
#@# set_value / for を収録したらリンクに戻す
449449
読み取り専用のバッファは、`IO::Buffer#set_value`[m:IO::Buffer#set_string]
450450
[m:IO::Buffer#copy] などで変更できません。
451-
`IO::Buffer.for` で作ったバッファや、読み取り専用のファイルから作ったバッファが
452-
これにあたります。
451+
452+
`IO::Buffer.for` にブロックを渡さずに作ったバッファは、元の文字列が freeze
453+
されているかどうかによらず、常に読み取り専用になります。内部で作った文字列の
454+
複製をバッファの元として使うためです。
455+
ブロックを渡した場合は元の文字列のメモリを直接参照するため、
456+
その文字列が freeze されている場合にだけ読み取り専用になります。
457+
読み取り専用のファイルから作ったバッファも読み取り専用です。
453458

454459
```ruby
455-
p IO::Buffer.for("test").readonly? # => true
456-
p IO::Buffer.new(4).readonly? # => false
460+
# ブロックを渡さない場合は、元の文字列が freeze されていなくても読み取り専用
461+
p IO::Buffer.for("test").readonly? # => true
462+
463+
# ブロックを渡した場合は元の文字列に従う
464+
p IO::Buffer.for("test") { |buf| buf.readonly? } # => false
465+
p IO::Buffer.for("test".freeze) { |buf| buf.readonly? } # => true
466+
467+
p IO::Buffer.new(4).readonly? # => false
457468
```
458469

459470
### def mapped? -> bool

0 commit comments

Comments
 (0)