如何遍历整数数组?
How to iterate over an array of integers?
在 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 error: mismatched types:
expected _
,
found &i64
(expected integral variable,
found &-ptr) [E0308]
Task2_minimalcode.rs:7 if (k % p != 0) {array.push(p)};
^
Task2_minimalcode.rs:7:34: 7:35 error: mismatched types:
expected i64
,
found &i64
(expected i64,
found &-ptr) [E0308]
Task2_minimalcode.rs:7 if (k % p != 0) {array.push(p)};
^
error: aborting due to 2 previous errors
Failed compilation.
引用错误信息:
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;
-- 错误消息将包含真实类型。
当您遍历切片(这是 Vec
的一个视图)时,您会得到 对向量 中项目的引用,而不是项目本身.
您可以用两种等效的方法解决这个问题。
// Mark the iteration variable as a reference
for &p in &array {
if (k % p != 0) {
array.push(p)
};
}
// Dereference the iteration variable
for p in &array {
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 {
if k % p != 0 {
output_array.push(p)
};
}
}
}
另请参阅:
在 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 error: mismatched types: expected
_
, found&i64
(expected integral variable, found &-ptr) [E0308] Task2_minimalcode.rs:7 if (k % p != 0) {array.push(p)};
^ Task2_minimalcode.rs:7:34: 7:35 error: mismatched types: expectedi64
, found&i64
(expected i64, found &-ptr) [E0308]Task2_minimalcode.rs:7 if (k % p != 0) {array.push(p)}; ^ error: aborting due to 2 previous errors Failed compilation.
引用错误信息:
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;
-- 错误消息将包含真实类型。
当您遍历切片(这是 Vec
的一个视图)时,您会得到 对向量 中项目的引用,而不是项目本身.
您可以用两种等效的方法解决这个问题。
// Mark the iteration variable as a reference
for &p in &array {
if (k % p != 0) {
array.push(p)
};
}
// Dereference the iteration variable
for p in &array {
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 {
if k % p != 0 {
output_array.push(p)
};
}
}
}
另请参阅: