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,因此在这方面进展缓慢事情。
从 Rust 1.51 开始,您可以使用array::IntoIter:
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}\nRun Code Online (Sandbox Code Playgroud)\n从 Rust 1.53 开始,您可以使用IntoIterator,但作为特殊情况,编译器将继续解析array.into_iter()以(&array).into_iter()实现向后兼容性。这包括for循环脱糖。
从 2021 版开始,特殊情况已被删除,数组迭代与任何其他类型一样工作。
\nche*_*gpu 11
从 Rust 1.53.0 开始,迭代的行为array发生了变化。现在我们可以按值迭代数组:
for i in [1, 2, 3] {
...
}
Run Code Online (Sandbox Code Playgroud)
该代码现在是合法的。更多信息请参见发布 Rust 1.53.0。
| 归档时间: |
|
| 查看次数: |
6853 次 |
| 最近记录: |