[英]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.