Slices

スライスは、より大きなコレクションに対するビューを提供します。

fn main() {
    let mut a: [i32; 6] = [10, 20, 30, 40, 50, 60];
    println!("a: {a:?}");

    let s: &[i32] = &a[2..4];

    println!("s: {s:?}");
}
  • スライスは、スライスされた型からデータを借用します。
  • 質問: s を出力する直前に a[3] を変更するとどうなるでしょうか?
This slide should take about 10 minutes.
  • スライスを作成するには、a を借用し、開始インデックスと終了インデックスを角かっこで囲んで指定します。

  • スライスがインデックス 0 から始まる場合、Rust の範囲構文により開始インデックスを省略できます。つまり、&a[0..a.len()]&a[..a.len()] は同じです。

  • 最後のインデックスについても同じことが言えるので、&a[2..a.len()]&a[2..] は同じです。

  • 配列全体のスライスを簡単に作成するには、&a[..] と書くことが出来ます。

  • s は i32 のスライスへの参照です。s の型(&[i32])に配列の長さが含まれなくなったことに注目してください。これにより、さまざまなサイズのスライスに対して計算を実行できます。

  • スライスは常に別のオブジェクトから借用します。この例では、a は少なくともスライスが存在する間は「存続」 している(スコープ内にある)必要があります。

  • a[3] の変更に関する質問は興味深い議論のきっかけになるかもしれませんが、メモリ安全性上の理由から、この時点では a を使用して変更することはできない、という回答になります。ただし、as の両方のデータを安全に読み取ることはできます。これは、スライスを作成する前と、println の後でスライスが使用されなくなったあとであれば、変更することが出来ます。