本文簡要介紹rust語言中 Primitive Type array 的用法。
一個固定大小的數組,表示為 [T; N] ,用於元素類型 T 和非負編譯時常量大小 N 。
創建數組有兩種語法形式:
- 每個元素的列表,即 [x, y, z]。
- 重複表達式 [x; N],它生成一個數組,其中包含N的x副本。x的類型必須是Copy。
請注意,[expr; 0] 是允許的,它會生成一個空數組。但是,這仍將評估 expr ,並立即刪除結果值,因此請注意副作用。
如果元素類型允許,任何大小的數組都會實現以下特征:
- std::marker::Copy
- std::clone::Clone
- std::fmt::Debug
-  IntoIterator(為[T; N]、&[T; N]和&mut [T; N]實現)
-  PartialEq,PartialOrd,Eq,Ord
- std::hash::Hash
-  AsRef,AsMut
-  Borrow,BorrowMut
如果元素類型允許,大小從 0 到 32(含)的數組實現  Default  特征。作為權宜之計,特征實現是靜態生成的,最大大小為 32。
數組強製切片 ([T]),因此可以在數組上調用切片方法。實際上,這提供了用於處理數組的大部分 API。切片具有動態大小,不會強製轉換為數組。
您可以使用 slice pattern 將元素移出數組。如果您想要一個元素,請參閱 mem::replace 。
例子
let mut array: [i32; 3] = [0; 3];
array[1] = 1;
array[2] = 2;
assert_eq!([1, 2], &array[1..]);
// This loop prints: 0 1 2
for x in array {
    print!("{} ", x);
}您還可以迭代對數組元素的引用:
let array: [i32; 3] = [0; 3];
for x in &array { }您可以使用 slice pattern 將元素移出數組:
fn move_away(_: String) { /* Do interesting things. */ }
let [john, roa] = ["John".to_string(), "Roa".to_string()];
move_away(john);
move_away(roa);版本
在 Rust 1.53 之前,數組沒有按值實現  IntoIterator ,因此方法調用 array.into_iter() 自動引用到 slice iterator 中。目前,為了兼容性,舊的行為保留在 2015 和 2018 版 Rust 中,按值忽略  IntoIterator 。將來,2015 和 2018 版本的行為可能會與後續版本的行為保持一致。
// Rust 2015 and 2018:
let array: [i32; 3] = [0; 3];
// This creates a slice iterator, producing references to each value.
for item in array.into_iter().enumerate() {
    let (i, x): (usize, &i32) = item;
    println!("array[{}] = {}", i, x);
}
// The `array_into_iter` lint suggests this change for future compatibility:
for item in array.iter().enumerate() {
    let (i, x): (usize, &i32) = item;
    println!("array[{}] = {}", i, x);
}
// You can explicitly iterate an array by value using
// `IntoIterator::into_iter` or `std::array::IntoIter::new`:
for item in IntoIterator::into_iter(array).enumerate() {
    let (i, x): (usize, i32) = item;
    println!("array[{}] = {}", i, x);
}從2021版開始,array.into_iter()正常使用IntoIterator進行值迭代,而iter()應該像以前的版本一樣使用引用迭代。
// Rust 2021:
let array: [i32; 3] = [0; 3];
// This iterates by reference:
for item in array.iter().enumerate() {
    let (i, x): (usize, &i32) = item;
    println!("array[{}] = {}", i, x);
}
// This iterates by value:
for item in array.into_iter().enumerate() {
    let (i, x): (usize, i32) = item;
    println!("array[{}] = {}", i, x);
}未來的語言版本可能會開始將 2015 和 2018 版的 array.into_iter() 語法與 2021 版相同。因此,在編寫使用這些舊版本的代碼時仍應牢記這一變化,以防止將來出現損壞。完成此操作的最安全方法是避免在這些版本中使用 into_iter 語法。如果版本更新不可行/不理想,則有多種選擇:
- 使用 iter,相當於舊行為,創建引用
- 使用  IntoIterator::into_iter,相當於 2021 年後的行為(Rust 1.53+)
- 將 for ... in array.into_iter() {替換為for ... in array {,相當於 2021 年後的行為(Rust 1.53+)
// Rust 2015 and 2018:
let array: [i32; 3] = [0; 3];
// This iterates by reference:
for item in array.iter() {
    let x: &i32 = item;
    println!("{}", x);
}
// This iterates by value:
for item in IntoIterator::into_iter(array) {
    let x: i32 = item;
    println!("{}", x);
}
// This iterates by value:
for item in array {
    let x: i32 = item;
    println!("{}", x);
}
// IntoIter can also start a chain.
// This iterates by value:
for item in IntoIterator::into_iter(array).enumerate() {
    let (i, x): (usize, i32) = item;
    println!("array[{}] = {}", i, x);
}相關用法
- Rust array.map用法及代碼示例
- Rust array.split_array_ref用法及代碼示例
- Rust array.zip用法及代碼示例
- Rust array.split_array_mut用法及代碼示例
- Rust array.each_mut用法及代碼示例
- Rust array.each_ref用法及代碼示例
- Rust args用法及代碼示例
- Rust args_os用法及代碼示例
- Rust assert_ne用法及代碼示例
- Rust assert_matches用法及代碼示例
- Rust addr_of_mut用法及代碼示例
- Rust alloc_zeroed用法及代碼示例
- Rust align_of用法及代碼示例
- Rust always_abort用法及代碼示例
- Rust assert_eq用法及代碼示例
- Rust available_parallelism用法及代碼示例
- Rust addr_of用法及代碼示例
- Rust abort用法及代碼示例
- Rust align_of_val用法及代碼示例
- Rust assert用法及代碼示例
- Rust alloc用法及代碼示例
- Rust align_of_val_raw用法及代碼示例
- Rust UdpSocket.set_multicast_loop_v6用法及代碼示例
- Rust i64.overflowing_add_unsigned用法及代碼示例
- Rust Box.downcast用法及代碼示例
注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 Primitive Type array。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。
