Ruby 4.1 リファレンスマニュアル

instance method IO::Buffer#slice

slice(offset = 0, length = nil) -> IO::Buffer::SliceRuby 3.1 から[permalink][rdoc][edit]
(Integer offset, Integer length) → Buffer

バッファの一部を指す新しい IO::Buffer を返します。

メモリのコピーは行わず、返されるバッファは元のバッファと同じメモリ領域を参照します。そのため、一方への書き込みはもう一方からも見えます。元のバッファが文字列やファイルに由来する場合、その関連も引き継がれます。

Ruby 4.1 からは IO::Buffer::Slice のインスタンスを返します。返されたスライスは self を参照元として保持し、IO::Buffer#source で取得できます。スライスからさらにスライスを作った場合の参照元は、直接の親です。

参照元が IO::Buffer::Storage#free や IO::Buffer::Storage#transfer で手放されたときや、縮小されて参照範囲が外に出たときは、スライスは無効になります。参照範囲が再び参照元の範囲内に収まれば、有効に戻ります。参照元のメモリ領域が別のアドレスに再確保されても、無効にはなりません。

[PARAM] offset:
参照を開始する位置をバッファの先頭からのバイト数で指定します。省略した場合は 0 になります。
[PARAM] length:
参照するバイト数を指定します。省略した場合はバッファの末尾までになります。
[EXCEPTION] ArgumentError:
offset や length が負の場合、または offset と length の合計がバッファのバイト数を超える場合に発生します。
buf = IO::Buffer.new(8)
buf.set_string("Ruby")

part = buf.slice(0, 4)
p part.get_string # => "Ruby"

# 同じメモリ領域を参照しているので、変更は元のバッファにも反映される
part.set_string("Xy")
p buf.get_string  # => "Xyby\x00\x00\x00\x00"

[SEE_ALSO] IO::Buffer#copy, IO::Buffer::Slice.new, IO::Buffer#source, IO::Buffer#advance