Arrays 如何迭代整数数组?
我可以做些什么来迭代Rust中的整数数组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]; 适用于范
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
。将切片的类型更改为更改子片和索引值。