配列型
配列型
サイズ固定配列。[T; N]
で表す。
生成には2つの構文がある。
[x, y, z]
[x; N]
: 値xはCopy
実装型でなければならない
配列は以下のトレイトを実装する。(ただしT
も同様に実装されている必要がある)
Copy
Clone
Debug
IntoIterator
:&[T; N]
もしくは&mut [T; N]
に対して実装されるPartialEq
,PartialOrd
,Eq
,Ord
Hash
AsRef
,AsMut
Borrow
,BorrowMut
Default
: 要素数が32までの配列の場合
配列に対してスライスメソッドを呼び出した場合、スライス型[T]
に強制する。
スライスはダイナミックサイズを持ち、また配列には強制しない。
スライスパターンを使うことで、要素を配列外に移動できる。
もし1要素がほしい場合は、mem::replace
を参照。
Examples
let mut array: [i32; 3] = [0; 3]; // 値0で初期化 array[1] = 1; array[2] = 2; assert_eq!([1,2], &array[1..]); // forループ文では、暗黙的にスライス型に変換されない (配列の参照型はIntoIterator実装型) for x in &arr { print!("{} ", x); }
配列は、Iterator,IntoIterator型どちらも実装していない
// NG for x in arr {}
スライス型[T]
のiter
メソッドを呼び出すと暗黙的に配列型をスライス型に型強制する。
for x in array.iter() { }
配列の参照型&[T; N]
は、IntoIterator
実装型。
impl<'a, T, const N: usize> IntoIterator for &'a [T; N] type Item = &'a T type IntoIter = Iter<'a, T>
for x in &array {}
スライスパターンを使って、配列の外に要素を移動できる。
fn move_away(_: String) {} let [john, roa] = ["john".to_string(), "Roa".to_string()]; move_away(john); move_away(roa);
型強制 Unsized coersions
- 配列型
[T;N]
は、Unsize<[T]>
を実装しているUnsize<T: ?Sized>
はマーカートレイト
CoerrceUnsized
トレイトによって、Unsize<U>
を実装しているT
型はU
型に強制する
これによって、配列において、スライス型のメソッドを呼び出すと、暗黙的に配列をスライス型に強制する。
参照
https://doc.rust-lang.org/std/primitive.array.html
スライスパターン
https://doc.rust-lang.org/reference/patterns.html#slice-patterns
// Fixed size let arr = [1, 2, 3]; match arr { [1, _, _] => "starts with one", [a, b, c] => "starts with something else", };