本文简要介绍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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。