// 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