Arrays 如何迭代整数数组?

Arrays 如何迭代整数数组?,arrays,iteration,rust,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)}; } } } fn main(){ 让mut数组:Vec=Vec![2]; 适用于范

我可以做些什么来迭代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)};
        }        
    }
}
fn main(){
让mut数组:Vec=Vec![2];
适用于范围内的k(31395){
对于数组中的p.iter(){
如果(k%p!=0){array.push(p)};
}        
}
}
给我编译器错误:

rustc“Task2_minimalcode.rs”(im Verzeichnis:C:\Users\XXX\Documents\Rust-Project Euler)

Task2\u最小代码。rs:7:14:7:15错误:不匹配的类型: 应为
, 找到
&i64
(预期积分变量, 找到和-ptr)[E0308] Task2_minimalcode.rs:7如果(k%p!=0){array.push(p)}
^ Task2\u最小代码。rs:7:34:7:35错误:不匹配的类型: 预期的
i64
, 找到
&i64
(预期为64, 找到和-ptr)[E0308]

Task2_minimalcode.rs:7如果(k%p!=0){array.push(p)}; ^ 错误:由于之前的两个错误而中止 编译失败


引用错误消息:

错误:不匹配的类型:应为i64,已找到和i64(应为i64,已找到和-ptr)

Vec::iter
为您提供了
&T
上的迭代器(参考
T
)。如果您不打算再次使用vec,您可以将
用于阵列中的p
用于阵列中的p.into_iter()
。如果您确实想再次使用它,您有几个选项:

  • &array
    array.iter()
    ,使用时取消对
    p
    的引用
  • array.iter().cloned()
  • array.iter().map(|e |*e)
    (实际上与上面相同)
如果所有这些关于参考文献的讨论都没有意义,您可能应该阅读本节


记住,你可以欺骗编译器告诉你一个变量的类型,比如:
let:()=p--错误消息将包含真实类型。

当您迭代一个切片(这是进入
Vec
的视图)时,您得到的是对向量中项目的引用,而不是项目本身的引用

你可以用两种等效的方法来解决这个问题

//将迭代变量标记为引用
用于阵列中的&p(&p){
如果(k%p!=0){
array.push(p)
};
}
//取消对迭代变量的引用
对于p-in&数组{
如果(k%*p!=0){
array.push(*p)
};
}
但是,接下来您会遇到下一个问题:当您迭代时,无法修改
Vec
!如果允许,向量可能需要重新分配支持它的内存,这将使迭代器中的所有引用无效。这是铁锈的一个强大卖点——它可以防止你像这样射中自己的脚

在不知道自己真正想做什么的情况下,这里有一种方法:

fn main(){
让input_array=vec![2u64];
让mut output_array=input_array.clone();
对于3..13195中的k{
用于输入数组中的&p&U{
如果k%p!=0{
输出_数组推送(p)
};
}
}
}
另见:


我再次需要那个向量。“在使用p时取消对它的引用。”我该怎么做&p不起作用
&p
引用
p
*p
取消引用
p
。你可能应该通读这本生锈的书;如果不了解Rust中的引用,你就不会走得太远:它们无处不在。我知道什么是引用/撤销限制,但来自托管代码(Java),我很难决定何时何地使用它:(.这就是我推荐这本书的原因;不是要知道它们在抽象中是什么,你需要了解它们是如何使用的。我的目标是Euler project task 3(),但似乎我需要得到一个更好的算法。我会过度思考我的程序,谢谢你的帮助:)。据我所知,切片将生成类型为
i32
,对吗?我想要一个
usize
值的切片,如何指定?@ArtemHevorhian切片返回任何类型的值。在这种情况下,它是
Vec
,因此子切片和索引值也将使用
u64
。将切片的类型更改为更改子片和索引值。