[英]Why can't I move out of index of Vec<Rc<dyn T>>?
首先,很抱歉我无法将一些重复的问题与我的问题进行比较,因为我是 Rust 的初学者。 可能重复的问题
编译器为我的代码输出一个错误:
error[E0507]: cannot move out of index of `std::vec::Vec<std::rc::Rc<dyn T>>`
--> src/lib.rs:30:18
|
30 | let V_last = data.V[V_lastIdx];
| ^^^^^^^^^^^^^^^^^
| |
| move occurs because value has type `std::rc::Rc<dyn T>`, which does not implement the `Copy` trait
| help: consider borrowing here: `&data.V[V_lastIdx]`
请帮我解决问题。
use std::collections::HashMap;
use std::rc::Rc;
trait T {
fn main(&self, data: &mut Data) -> ();
}
#[derive(Clone)]
struct S1 {
val: usize,
t: Rc<dyn T>,
}
struct S2 {
val: usize,
}
impl T for S1 {
fn main(&self, data: &mut Data) -> () {
data.V.push(Rc::new(S2 { val: 123 }));
}
}
impl T for S2 {
fn main(&self, data: &mut Data) -> () {}
}
struct Data {
// Up to 1 instance which may hold about 30MB at most.
V: Vec<Rc<dyn T>>,
name_match: HashMap<String, (usize, usize)>,
}
fn round(data: &mut Data) {
let V_lastIdx = data.V.len() - 1;
let V_last = data.V[V_lastIdx];
return V_last.main(data);
}
在我按照编译器的建议进行操作后,出现如下新错误。
help: consider borrowing here: `&data.V[V_lastIdx]`
error[E0502]: cannot borrow `*data` as mutable because it is also borrowed as immutable
--> src/lib.rs:34:11
let V_last= &data.V[V_lastIdx];
| ------ immutable borrow occurs here
34 | return V_last.main(data);
| ^^^^^^^----^^^^^^
| | |
| | immutable borrow later used by call
| mutable borrow occurs here
现在我已经选择了答案,我注意到我的原始代码可以更简单,如下链接,解决方案代码是从所选答案中借用的。
当您执行some_vec[index]
,它会尝试将元素移出 vec,但这是不允许的。 编译器提供的一种解决方法是借用元素: &some_vec[index]
。 但是,编译器拒绝该解决方案,它也应该拒绝,因为如果允许使用self
作为对data
元素的引用的main
调用将/可能会被.push
调用无效。
如您的自我回答所示,另一个修复是需要克隆vec V
以便它们具有不同的所有权,因此引用不能无效。
更好的解决方案是克隆元素而不是整个向量。 鉴于您的元素是Rc
s,因此克隆成本低,这是一个特别合理的解决方案:
fn round(data: &mut Data) {
let V_lastIdx = data.V.len() - 1;
let V_last = data.V[V_lastIdx].clone();
// ^^^^^^^^
return V_last.main(data);
}
阅读已接受的答案,我意识到我下面的解决方案对于我的目的来说根本不是一个好主意。
我通过编辑round
函数自己解决了错误如下。
前:
fn round(data: &mut Data) {
let V_lastIdx = data.V.len() - 1;
let V_last= &data.V[V_lastIdx];
V_last.main(data)
}
后:
fn round(V: Vec<Rc<T>>, data: &mut Data) {
let V_lastIdx = V.len() - 1;
let V_last = &V[V_lastIdx];
V_last.main(data)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.