Rust
配列、ベクトル、スライス
サーチ…
配列
配列は、単一の型のオブジェクトの静的サイズのスタック割り当てのリストです。
配列は、通常、角括弧で囲まれた型の要素のリストを囲むことで作成されます。配列の型は特殊な構文で表されます: [T; N]
ここで、 T
はその要素の型であり、 N
そのカウントであり、どちらもコンパイル時に知られていなければならない。
たとえば、 [4u64, 5, 6]
は3要素配列の[u64; 3]
。注: 5
および6
は、タイプがu64
であると推測されます。
例
fn main() {
// Arrays have a fixed size.
// All elements are of the same type.
let array = [1, 2, 3, 4, 5];
// Create an array of 20 elements where all elements are the same.
// The size should be a compile-time constant.
let ones = [1; 20];
// Get the length of an array.
println!("Length of ones: {}", ones.len());
// Access an element of an array.
// Indexing starts at 0.
println!("Second element of array: {}", array[1]);
// Run-time bounds-check.
// This panics with 'index out of bounds: the len is 5 but the index is 5'.
println!("Non existant element of array: {}", array[5]);
}
制限事項
配列(またはスライス)のパターンマッチングは、安定した錆( #23121とスライスパターン参照)ではサポートされていません。
Rustはタイプレベルの数値の総称をサポートしていません( RFC#1657参照)。したがって、(すべてのサイズの)すべての配列の特性を単純に実装することはできません。結果として、標準的な形質は、限られた数の要素までの配列に対してのみ実装されます(最後にチェックされ、32までが含まれます)。より多くの要素を持つ配列はサポートされていますが、標準的な特性を実装していません( ドキュメントを参照)。
これらの規制は将来的には解除されることが望まれる。
ベクトル
ベクトルは本質的に、単一の型のオブジェクトのヒープ割り当てされた動的サイズのリストへのポインタです。
例
fn main() {
// Create a mutable empty vector
let mut vector = Vec::new();
vector.push(20);
vector.insert(0, 10); // insert at the beginning
println!("Second element of vector: {}", vector[1]); // 20
// Create a vector using the `vec!` macro
let till_five = vec![1, 2, 3, 4, 5];
// Create a vector of 20 elements where all elements are the same.
let ones = vec![1; 20];
// Get the length of a vector.
println!("Length of ones: {}", ones.len());
// Run-time bounds-check.
// This panics with 'index out of bounds: the len is 5 but the index is 5'.
println!("Non existant element of array: {}", till_five[5]);
}
スライス
スライスはオブジェクトのリストへのビューであり、タイプT
のオブジェクトのスライスを示すタイプ[T]
を持っています。
スライスはサイズの小さい型であるため、ポインタの後ろでしか使用できません。 (文字列の世界的な類推: str
列スライスとも呼ばれるstr
もサイズが設定されていません)
配列は強制的にスライスになり、ベクトルはスライスに逆参照できます。したがって、両方の方法にスライス方法を適用することができます。 (文字列の世界の類推: str
はString
、 [T]
はVec<T>
です)。
fn main() {
let vector = vec![1, 2, 3, 4, 5, 6, 7, 8];
let slice = &vector[3..6];
println!("length of slice: {}", slice.len()); // 3
println!("slice: {:?}", slice); // [4, 5, 6]
}