繁体   English   中英

为什么 Rust 中的 for 循环可以遍历切片或迭代器,而不是数组?

[英]Why can a for loop in Rust iterate over a slice or iterator, but not an array?

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

循环数组:

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

    for element in a {
        println!("element={}", element);
    }
}
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`

循环切片(版本 1):

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

    for element in a {
        println!("element={}", element);
    }
}
element=1
element=2
element=3
element=4
element=5

循环切片(版本 2):

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

    for element in &a {
        println!("element={}", element);
    }
}
element=1
element=2
element=3
element=4
element=5

循环遍历数组迭代器:

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

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

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

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

    for element in v {
        println!("element={}", element);
    }
}
element=1
element=2
element=3
element=4
element=5

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

为数组实现IntoIterator一个长期存在的问题,不幸的是,添加这将是一个突破性的变化,并且生态系统中存在“只是做”的已知问题,因此在这个问题上进展缓慢。

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

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

    for element in std::array::IntoIter::new(a) {
        println!("element={}", element);
    }
}

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

for i in [1, 2, 3] {
    ...
}

该代码现在是合法的。 宣布 Rust 1.53.0 中查看更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM