当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust array用法及代码示例


本文简要介绍rust语言中 Primitive Type array 的用法。

一个固定大小的数组,表示为 [T; N] ,用于元素类型 T 和非负编译时常量大小 N

创建数组有两种语法形式:

  • 每个元素的列表,即 [x, y, z]
  • 重复表达式 [x; N] ,它生成一个数组,其中包含 Nx 副本。 x 的类型必须是 Copy

请注意,[expr; 0] 是允许的,它会生成一个空数组。但是,这仍将评估 expr ,并立即删除结果值,因此请注意副作用。

如果元素类型允许,任何大小的数组都会实现以下特征:

如果元素类型允许,大小从 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-lang.org大神的英文原创作品 Primitive Type array。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。