rust - move 发生是因为 value 的类型为 Vec,它没有实现 `Copy` 特征
问题描述
我正在编写一个非常简单的递归程序来查找两个数字之间的所有素数:
use std::cmp::PartialOrd;
use std::ops::{Add, Div, Rem, Sub};
fn _is_prime<T>(n: T, dividend: T, one: T) -> bool
where
T: Copy + Rem<Output = T> + Sub<Output = T> + PartialOrd,
{
if dividend == one {
true
} else {
if n % dividend < one {
false
} else {
_is_prime(n, dividend - one, one)
}
}
}
fn _primes_between<'a, T>(a: T, b: T, one: T, v: &'a mut Vec<T>) -> &'a mut Vec<T>
where
T: Copy + Rem<Output = T> + Add<Output = T> + Sub<Output = T> + PartialOrd,
{
if a <= b {
if _is_prime(a, a - one, one) {
v.push(a);
}
_primes_between(a + one, b, one, v)
} else {
v
}
}
fn primes_between<T>(a: T, b: T) -> Vec<T>
where
T: Copy + Div<Output = T> + Rem<Output = T> + Add<Output = T> + Sub<Output = T> + PartialOrd,
{
let one = a / a;
let mut v: Vec<T> = Vec::new();
*_primes_between(a, b, one, &mut v)
}
fn main() {
primes_between(3, 13).iter().for_each(|i| println!("{}", i));
}
问题是:
error[E0507]: cannot move out of a mutable reference
--> src/main.rs:42:5
|
42 | *_primes_between(a, b, one, &mut v)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ move occurs because value has type `std::vec::Vec<T>`, which does not implement the `Copy` trait
我该如何解决这个错误?
解决方案
我不是 100% 确定,但我认为问题在于_primes_between()
返回第 31 行代码试图复制的引用。(通过*
操作员获得所有权)您可以通过调用.clone()
结果来解决问题,但我认为在这种情况下您不需要_primes_between()
返回值 - 您只需将适当的条目添加到v
参数中即可。就像是
fn _primes_between<T>(a: T, b: T, one: T, v: &mut Vec<T>)
where
T: Copy + Rem<Output = T> + Add<Output = T> + Sub<Output = T> + PartialOrd,
{
if a <= b {
if _is_prime(a, a - one, one) {
v.push(a);
}
_primes_between(a + one, b, one, v);
}
}
fn primes_between<T>(a: T, b: T) -> Vec<T>
where
T: Copy + Div<Output = T> + Rem<Output = T> + Add<Output = T> + Sub<Output = T> + PartialOrd,
{
let one = a / a;
let mut v: Vec<T> = Vec::new();
_primes_between(a, b, one, &mut v);
v
}
推荐阅读
- c# - 调用下一个委托后,中间件应使请求失败
- java - 定期从 spring 安全上下文中检索到的用户为空
- php - Spatie Medialibrary 裁剪图像白色背景边框
- wordpress - 在 WordPress 中为 SplitIt Payments 重新定位插件操作 woocommerce_before_cart_totals
- python - 将数据库项目输出到 pdf 文档
- hyperledger-fabric - 为什么 Go 链码不需要注解?
- kurento - Kurento自定义过滤器未实现
- opengl - 找到形成三角形到对象位置的最近顶点?
- android - 如何在 Android onDevice 语言下载大小上获取 ML Kit?
- javascript - 带有 ngrok 的 webpack-dev-server 4