为什么 Rust 中的 for 循环可以迭代切片或迭代器,但不能迭代数组?

Der*_*har 5 arrays iterator vector slice rust

为什么 Rust 1.44.0 中的循环可以for迭代切片或迭代器,但不能迭代数组?例如,以下内容让我陷入了困境:

循环数组:

fn main() {
    let a = [1, 2, 3, 4, 5];

    for element in a {
        println!("element={}", element);
    }
}
Run Code Online (Sandbox Code Playgroud)
fn main() {
    let a = [1, 2, 3, 4, 5];

    for element in a {
        println!("element={}", element);
    }
}
Run Code Online (Sandbox Code Playgroud)

循环切片(版本 1):

fn main() {
    let a = &[1, 2, 3, 4, 5];

    for element in a {
        println!("element={}", element);
    }
}
Run Code Online (Sandbox Code Playgroud)
error[E0277]: `[{integer}; 5]` is not an iterator
 --> main.rs:4:20
  |
4 |     for element in a {
  |                    ^ borrow the array with `&` or call `.iter()` on it to iterate over it
  |
  = help: the trait `std::iter::Iterator` is not implemented for `[{integer}; 5]`
  = note: arrays are not iterators, but slices like the following are: `&[1, 2, 3]`
  = note: required by `std::iter::IntoIterator::into_iter`
Run Code Online (Sandbox Code Playgroud)

循环切片(版本 2):

fn main() {
    let a = [1, 2, 3, 4, 5];

    for element in &a {
        println!("element={}", element);
    }
}
Run Code Online (Sandbox Code Playgroud)
fn main() {
    let a = &[1, 2, 3, 4, 5];

    for element in a {
        println!("element={}", element);
    }
}
Run Code Online (Sandbox Code Playgroud)

循环数组迭代器:

fn main() {
    let a = [1, 2, 3, 4, 5];

    for element in a.iter() {
        println!("element={}", element);
    }
}
Run Code Online (Sandbox Code Playgroud)
element=1
element=2
element=3
element=4
element=5
Run Code Online (Sandbox Code Playgroud)

Rust 也可以通过这种方式在向量上循环:

fn main() {
    let v = vec![1, 2, 3, 4, 5];

    for element in v {
        println!("element={}", element);
    }
}
Run Code Online (Sandbox Code Playgroud)
fn main() {
    let a = [1, 2, 3, 4, 5];

    for element in &a {
        println!("element={}", element);
    }
}
Run Code Online (Sandbox Code Playgroud)

mca*_*ton 13

编译器会告诉你原因:因为数组不是迭代器。

\n

数组的实现存在一个长期存在的问题IntoIterator,不幸的是,添加这将是一个重大更改,并且 \xe2\x80\x9c 生态系统中存在已知问题,\xe2\x80\x9c 只是这样做\xe2\x80\x9d,因此在这方面进展缓慢事情。

\n

从 Rust 1.51 开始,您可以使用array::IntoIter

\n
fn main() {\n    let a = [1, 2, 3, 4, 5];\n\n    for element in std::array::IntoIter::new(a) {\n        println!("element={}", element);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

从 Rust 1.53 开始,您可以使用IntoIterator,但作为特殊情况,编译器将继续解析array.into_iter()(&array).into_iter()实现向后兼容性。这包括for循环脱糖。

\n

从 2021 版开始,特殊情况已被删除,数组迭代与任何其他类型一样工作。

\n

  • @Derek 与任何其他类型相同的方式:[有一个用于 `&[T]` 的 `IntoIterator` 实现](https://doc.rust-lang.org/std/primitive.slice.html#impl-进入迭代器-1)。 (2认同)

che*_*gpu 11

从 Rust 1.53.0 开始,迭代的行为array发生了变化。现在我们可以按值迭代数组:

for i in [1, 2, 3] {
    ...
}
Run Code Online (Sandbox Code Playgroud)

该代码现在是合法的。更多信息请参见发布 Rust 1.53.0