本文簡要介紹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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。