配列型

配列型

サイズ固定配列。[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",
};