繁体   English   中英

为什么我不能移出 Vec 的索引<Rc<dyn T> &gt;?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM