我正在学习生锈并有一个简单的程序,如下所示。 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>
并认为它可以解决我的需求?谢谢你的帮助!!
错误显示是因为您试图将输入向量中的一个向量的所有权移动到输出向量,这是不可允许的,因为您已经无限地借用了输入向量。 to_vec()
创建了一个副本,这就是它使用它时的工作原理。
解决方案取决于您要做的事情。如果您不需要原始输入(您只需要匹配的输入),您可以简单地通过值而不是通过引用传递输入,这将允许您使用向量并将项目移动到输出。 Here's an example of this。
如果确实需要原始输入,但不想使用to_vec()
复制向量,则可能需要在输出中使用引用,如this example所示。请注意,该函数现在返回向量的引用向量,而不是向量的向量。
对于其他情况,还有其他选择。如果由于某种原因需要由多个项目拥有数据,可以尝试使用Rc<T>
或Arc<T>
作为引用计数的智能指针,可以克隆这些指针以提供多个所有者对相同数据的不可变访问。