如何在Rust中迭代整数数组?
fn main () {
let mut array: Vec<i64> = vec![2];
for k in range(3, 13195) {
for p in array.iter() {
if (k % p != 0) {array.push(p)};
}
}
}
给我编译错误:
rustc“Task2_minimalcode.rs”(im Verzeichnis:C:\ Users \ XXX \ Documents \ Rust - Project Euler)
Task2_minimalcode.rs:7:14:7:15错误:类型不匹配: 预期
_
, 找到&i64
(预期的积分变量, 发现&amp; -ptr)[E0308] Task2_minimalcode.rs:7 if(k%p!= 0){array.push(p)};
^ Task2_minimalcode.rs:7:34:7:35错误:不匹配的类型: 预期i64
, 找到&i64
(预计i64, 发现&amp; -ptr)[E0308]Task2_minimalcode.rs:7 if(k%p!= 0){array.push(p)}; ^ 错误:由于之前的2个错误导致中止 编译失败。
答案 0 :(得分:2)
确认错误消息:
error: mismatched types: expected i64, found &i64 (expected i64, found &-ptr)
Vec<T>::iter
为&T
提供了一个迭代器(对T
的引用)。如果您不打算再次使用vec,可以使用for p in array
或for p in array.into_iter()
。如果你做想再次使用它,你有几个选择:
&array
或array.iter()
,并在使用时解除引用p
。array.iter().cloned()
array.iter().map(|e| *e)
(实际上与上述相同)如果所有关于参考文献的讨论都没有意义,那么您应该阅读Rust Book on Pointers的部分。
请记住,您可以欺骗编译器告诉您类似的变量类型:let _:() = p;
- 错误消息将包含真实类型。
答案 1 :(得分:1)
当您遍历切片(这是Vec
的视图)时,您将获得对向量中项目的引用,而不是项目本身。
您可以通过两种等效的方式解决这个问题。
// Mark the iteration variable as a reference
for &p in array.iter() {
if (k % p != 0) { array.push(p) };
}
// Dereference the iteration variable
for p in array.iter() {
if (k % *p != 0) { array.push(*p) };
}
然而,您遇到了下一个问题:在迭代时无法修改Vec!如果允许,向量可能需要重新分配支持它的内存,这反过来会使迭代器中的所有引用无效。这是Rust的一个强烈卖点 - 它可以防止你像这样在脚下射击自己!
不知道你真正想做什么,这是一种方法:
fn main () {
let input_array = vec![2u64];
let mut output_array = input_array.clone();
for k in 3..13195 {
for &p in input_array.iter() {
if k % p != 0 { output_array.push(p) };
}
}
}