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