我正在学习锈并且有一个简单的程序,如下所示。 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>
,并认为它可以为我的需求提供解决方案?谢谢您的帮助!
答案 0 :(得分:1)
由于您正在尝试将输入向量中向量之一的所有权移至输出向量,因此出现错误,这是不允许的,因为您已经不可变地借用了输入向量。 to_vec()
创建一个副本,这就是为什么当您使用它时起作用。
解决方案取决于您要执行的操作。如果不需要原始输入(只需要匹配的输入),则可以简单地按值而不是按引用传递输入,这将允许您使用向量并将项目移至输出。 Here's an example of this。
如果确实需要原始输入,但又不想用to_vec()
复制向量,则可能要在输出中使用引用,如this example所示。请注意,该函数现在返回对向量的引用向量,而不是所拥有向量的向量。
对于其他情况,还有其他选择。如果出于某种原因您需要数据归多个项目拥有,则可以尝试使用Rc<T>
或Arc<T>
来获得引用计数的智能指针,可以将其克隆以提供多个对象对同一数据的不变访问所有者。