如何迭代整数数组?

时间:2015-02-07 04:02:50

标签: arrays iteration rust

如何在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个错误导致中止   编译失败。

2 个答案:

答案 0 :(得分:2)

确认错误消息:

  

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; - 错误消息将包含真实类型。

答案 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) };
        }        
    }
}