我正在尝试计算Rust(项目Euler 7)中的第10001个素数,作为其一部分,我检查整数是否为素数的方法引用了一个向量:
fn main() {
let mut count: u32 = 1;
let mut num: u64 = 1;
let mut primes: Vec<u64> = Vec::new();
primes.push(2);
while count < 10001 {
num += 2;
if vectorIsPrime(num, primes) {
count += 1;
primes.push(num);
}
}
}
fn vectorIsPrime(num: u64, p: Vec<u64>) -> bool {
for i in p {
if num > i && num % i != 0 {
return false;
}
}
true
}
当我尝试引用向量时,出现以下错误:
error[E0382]: use of moved value: `primes`
--> src/main.rs:9:31
|
9 | if vectorIsPrime(num, primes) {
| ^^^^^^ value moved here, in previous iteration of loop
|
= note: move occurs because `primes` has type `std::vec::Vec<u64>`, which does not implement the `Copy` trait
我有什么做的,primes
为了能够在内部访问它vectorIsPrime
的功能?
使用函数的当前定义vectorIsPrime()
,该函数指定它需要参数的所有权,因为您按值传递了该参数。
当函数按值要求参数时,编译器将通过检查其是否实现trait来检查是否可以复制该值Copy
。
这就是您所收到的错误消息的含义。
但是,大多数函数不需要参数的所有权:它们可以在“借用的引用”上工作,这意味着它们实际上并不拥有该值(例如,不能将其放入容器中或销毁它)。
fn main() {
let mut count: u32 = 1;
let mut num: u64 = 1;
let mut primes: Vec<u64> = Vec::new();
primes.push(2);
while count < 10001 {
num += 2;
if vector_is_prime(num, &primes) {
count += 1;
primes.push(num);
}
}
}
fn vector_is_prime(num: u64, p: &[u64]) -> bool {
for &i in p {
if num > i && num % i != 0 {
return false;
}
}
true
}
vector_is_prime()
现在,该函数指定仅需要一个切片,即,您可以使用借位运算符从向量中获取数组的借入指针(包括其大小)&
。
有关所有权的更多信息,请您阅读本书中有关所有权的部分。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句