避免在不使用“ to_vec”的情况下“无法移出借用的内容”?

时间:2019-03-06 17:45:09

标签: rust

我正在学习锈并且有一个简单的程序,如下所示。 Playground link

#[derive(Debug)]
pub struct Foo {
    bar: String,
}

pub fn gather_foos<'a>(data: &'a Vec<Vec<&'a Foo>>) -> Vec<Vec<&'a Foo>> {
    let mut ret: Vec<Vec<&Foo>> = Vec::new();

    for i in 0..data.len() {
        if meets_requirements(&data[i]) {
            ret.push(data[i].to_vec());
        }
    }

    return ret
}

fn meets_requirements<'a>(_data: &'a Vec<&'a Foo>) -> bool {
    true
}

fn main() {
    let foo = Foo{
        bar: String::from("bar"),
    };
    let v1 = vec![&foo, &foo, &foo];
    let v2 = vec![&foo, &foo];
    let data = vec![v1, v2];

    println!("{:?}", gather_foos(&data));
}

程序仅循环遍历一个结构的数组,检查该结构的数组是否满足某些要求,然后返回满足该要求的数组。

我敢肯定有一种更有效的方法,而无需调用to_vec(),为了避免出现错误cannot move out of borrowed content,我必须实现该方法,但是我不确定该解决方案是。

我现在正在了解Box<T>,并认为它可以为我的需求提供解决方案?谢谢您的帮助!

1 个答案:

答案 0 :(得分:1)

由于您正在尝试将输入向量中向量之一的所有权移至输出向量,因此出现错误,这是不允许的,因为您已经不可变地借用了输入向量。 to_vec()创建一个副本,这就是为什么当您使用它时起作用。

解决方案取决于您要执行的操作。如果不需要原始输入(只需要匹配的输入),则可以简单地按值而不是按引用传递输入,这将允许您使用向量并将项目移至输出。 Here's an example of this

如果确实需要原始输入,但又不想用to_vec()复制向量,则可能要在输出中使用引用,如this example所示。请注意,该函数现在返回对向量的引用向量,而不是所拥有向量的向量。

对于其他情况,还有其他选择。如果出于某种原因您需要数据归多个项目拥有,则可以尝试使用Rc<T>Arc<T>来获得引用计数的智能指针,可以将其克隆以提供多个对象对同一数据的不变访问所有者。