Skip to content

Commit f68d293

Browse files
Watson1978claude
andcommitted
IO::Buffer: 状態問い合わせの 10 メソッドを追加
empty? / null? / valid? / internal? / external? / readonly? / mapped? / locked? / shared? / private? を追加した。 登場バージョンを実機で確認したところ、8 個は IO::Buffer が導入された 3.1 から あるが、shared? は 3.2、private? は 3.3 からで、それぞれ #@SInCE で分岐した。 readonly? の説明は実機に合わせた。rdoc には「Frozen strings and read-only files create read-only buffers.」とあるが、IO::Buffer.for は凍結していない 文字列から作っても読み取り専用のバッファになる (3.1〜4.0 で確認)。 ブロックを渡した場合のみ書き込み可能になる。 例に使ったコードは 3.1 / 3.2 / 3.3 / 4.0 で実行し、すべて同じ出力になることを 確認している。valid? / mapped? / locked? / shared? / private? は、簡潔で 安定した例を作るのが難しいため、説明のみとした。 bitclust のデータベース生成を 3.1 / 3.2 / 3.3 / 4.0 で実行してエラーが出ないこと、 登録されるメソッドが 8 / 9 / 10 / 10 件と追加バージョンどおりになることを確認済み。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 5bcc2e4 commit f68d293

1 file changed

Lines changed: 115 additions & 0 deletions

File tree

manual/api/_builtin/IO__Buffer.md

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,3 +369,118 @@ p buf.size # => 4
369369
```
370370

371371
- **SEE** [m:IO::Buffer#transfer], [m:IO::Buffer#null?]
372+
373+
### def empty? -> bool
374+
375+
バッファの大きさが 0 の場合に true を返します。
376+
377+
大きさ 0 のバッファは、[m:IO::Buffer.new] に 0 を渡すか、
378+
空文字列から [m:IO::Buffer.for] で作った場合などにできます。
379+
380+
```ruby
381+
p IO::Buffer.new(0).empty? # => true
382+
p IO::Buffer.new(4).empty? # => false
383+
```
384+
385+
### def null? -> bool
386+
387+
バッファがどのメモリ領域も指していない場合に true を返します。
388+
389+
[m:IO::Buffer#free] で解放したバッファ、[m:IO::Buffer#transfer] で所有権を手放した
390+
バッファ、および最初からメモリ領域を確保していないバッファがこれにあたります。
391+
392+
```ruby
393+
p IO::Buffer.new(0).null? # => true
394+
395+
buf = IO::Buffer.new(4)
396+
p buf.null? # => false
397+
buf.free
398+
p buf.null? # => true
399+
```
400+
401+
- **SEE** [m:IO::Buffer#free], [m:IO::Buffer#transfer]
402+
403+
### def valid? -> bool
404+
405+
バッファがアクセス可能な場合に true を返します。
406+
407+
別のバッファや文字列の一部を参照している([m:IO::Buffer#slice] で作った)バッファは、
408+
参照元が解放されたり別のアドレスに再確保されたりすると、アクセスできなくなります。
409+
410+
### def internal? -> bool
411+
412+
バッファが内部(internal)バッファである場合に true を返します。
413+
414+
内部バッファは、バッファ自身が確保したメモリ領域を参照します。
415+
文字列などの外部のメモリやファイルのマッピングとは結び付いていません。
416+
[m:IO::Buffer.new] で作られるバッファは既定で内部バッファです。
417+
418+
```ruby
419+
p IO::Buffer.new(4).internal? # => true
420+
```
421+
422+
- **SEE** [m:IO::Buffer#external?]
423+
424+
### def external? -> bool
425+
426+
バッファが外部(external)バッファである場合に true を返します。
427+
428+
外部バッファは、バッファ自身が確保・マップしたのではないメモリ領域を参照します。
429+
[m:IO::Buffer.for] で作ったバッファは、文字列のメモリを外部参照します。
430+
外部バッファは大きさを変更できません。
431+
432+
```ruby
433+
p IO::Buffer.for("test").external? # => true
434+
p IO::Buffer.new(4).external? # => false
435+
```
436+
437+
- **SEE** [m:IO::Buffer#internal?]
438+
439+
### def readonly? -> bool
440+
441+
バッファが読み取り専用の場合に true を返します。
442+
443+
読み取り専用のバッファは、[m:IO::Buffer#set_value][m:IO::Buffer#set_string]
444+
[m:IO::Buffer#copy] などで変更できません。
445+
[m:IO::Buffer.for] で作ったバッファや、読み取り専用のファイルから作ったバッファが
446+
これにあたります。
447+
448+
```ruby
449+
p IO::Buffer.for("test").readonly? # => true
450+
p IO::Buffer.new(4).readonly? # => false
451+
```
452+
453+
### def mapped? -> bool
454+
455+
バッファがマップ(mapped)バッファである場合に true を返します。
456+
457+
マップバッファは、仮想メモリ機構でマップされたメモリ領域を参照します。
458+
[m:IO::Buffer.new][m:IO::Buffer::MAPPED] を指定した場合や、
459+
大きさが [m:IO::Buffer::PAGE_SIZE] 以上の場合は匿名のマップになります。
460+
[m:IO::Buffer.map] で作った場合はファイルに紐づいたマップになります。
461+
462+
### def locked? -> bool
463+
464+
バッファがロックされている場合に true を返します。
465+
466+
ロックされたバッファは大きさの変更や解放ができず、
467+
さらにロックを取得することもできません。
468+
システムコールでバッファを使っている間に、そのバッファが移動しないことを
469+
保証するための仕組みです。
470+
471+
#@since 3.2
472+
### def shared? -> bool
473+
474+
バッファが共有(shared)バッファである場合に true を返します。
475+
476+
共有バッファは、他のプロセスと共有できるメモリ領域を参照します。
477+
そのため、このプロセスで変更しなくても内容が変わることがあります。
478+
#@end
479+
480+
#@since 3.3
481+
### def private? -> bool
482+
483+
バッファがプライベート(private)バッファである場合に true を返します。
484+
485+
プライベートバッファに加えた変更は、元になったファイルのマッピングには反映されません。
486+
#@end

0 commit comments

Comments
 (0)