如何遍历整数数组?

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 arrayfor p in array.into_iter()。如果您确实想再次使用它,您有几种选择:

  • &arrayarray.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)
            };
        }
    }
}

另请参阅: