Progrust Library.

// dictionary

スライス.

スライス[T]は、同じ型Tの要素が連続して並んだ列を指す「ビュー」となるプリミティブ型です。配列型ベクタ(Vec)が持つデータを、所有せずに一部分または全体だけ借りて扱えます。コンパイル時にサイズが決まらない「動的サイズ型」のため単独の変数には置けず、通常は共有スライス&[T]または可変スライス&mut [T]という参照の形で使います。

fn main() {
    let prices: [i32; 5] = [120, 250, 80, 300, 150];
    let first_three: &[i32] = &prices[0..3]; // 先頭3件だけを借りるビュー
    println!("対象: {:?}", first_three);
    println!("件数: {}", first_three.len());
}
Playgroundで開く

参照の中身と境界チェック

&[T]は「データ先頭へのポインタ」と「要素数」の2つを組にした参照で、通常の参照の2倍のサイズを持ちます。要素数を実行時に保持しているため、安全なメソッドや添字アクセスは常に境界チェックされます。

補足

要素数が違っても同じ型として扱える

配列型は要素数が型の一部([i32; 3][i32; 5]は別の型)ですが、スライスは要素数を型に含みません。そのため引数を&[i32]にした関数は、要素数の異なる配列やVec<i32>のどれからでも同じように呼び出せます。列を受け取る関数の引数は&[T]にするのが定番です。

要素数が型の一部 データの所有
配列 [i32; 3] 所有する
スライス &[i32] 借用(所有しない)
Vec<i32> 所有する
fn total(prices: &[i32]) -> i32 {
    prices.iter().sum()
}

fn main() {
    let cart = [120, 250, 80];
    println!("合計: {}円", total(&cart)); // 配列全体をスライスとして渡す
    println!("2件の合計: {}円", total(&cart[0..2]));
}
Playgroundで開く
参照以外のポインタ型と文字列スライス

スライスは&[T]&mut [T]のほか、Box<[T]>(boxed slice)のようにデータを所有するポインタ型を通して使うこともできます(The Rust Reference, Slice types)。また文字列スライスstr)は、メモリ表現が[u8]のスライスと同じで、中身が常に有効なUTF-8であることを前提にした文字列専用の型です。

この辞書が使われているページ

backlinks 6

  1. 辞書ベクタ(Vec)
  2. 辞書自動参照・自動参照外し
  3. 辞書範囲式
  4. 動かして学ぶRustプログラミング問題集 › 第5章 タプルと配列・スライス
  5. 動かして学ぶRustプログラミング問題集 › 第6章 文字列とベクタ
  6. 動かして学ぶRustプログラミング問題集 › 第8章 参照と借用