スライス
スライスは、より大きなコレクションの一部へのビューを提供します:
// Copyright 2024 Google LLC // SPDX-License-Identifier: Apache-2.0 fn main() { let a: [i32; 6] = [10, 20, 30, 40, 50, 60]; println!("a: {a:?}"); let s: &[i32] = &a[2..4]; println!("s: {s:?}"); }
- スライスは、切り出し元の型からデータを借用します。
-
スライスは
aを借用し、角括弧内で開始インデックスと終了 インデックスを指定して作成します。 -
スライスがインデックス 0 から始まる場合、Rust の範囲構文では開始 インデックスを省略できます。つまり、
&a[0..a.len()]と&a[..a.len()]は 同一です。 -
終了側のインデックスについても同様なので、
&a[2..a.len()]と&a[2..]は 同一です。 -
したがって、配列全体のスライスは
&a[..]を使うと簡単に作成できます。 -
sはi32のスライスへの参照です。sの型 (&[i32]) には、もはや配列の長さが含まれていないことに注目して ください。これにより、サイズの異なるスライスに対して計算を行えます。 -
スライスは常に別のオブジェクトから借用します。この例では、少なくとも スライスが存在している間は、
aが ‘alive’(スコープ内にあること)で なければなりません。 -
一度作成したスライスを後から「拡張」することはできません:
- スライスは基になるバッファを所有していないため、要素を追加 できません。
- スライスが基になるバッファのより大きな領域を指すように拡張することも できません。スライスは基になるバッファの長さに関する情報を持たない ため、どこまで大きくできるかを知ることができません。
- より大きなスライスが必要な場合は、元のバッファに戻って、そこから より大きなスライスを作成する必要があります。