Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 避免";无法移出借用的内容“;不使用;到“vec”吗;?_Rust - Fatal编程技术网

Rust 避免";无法移出借用的内容“;不使用;到“vec”吗;?

Rust 避免";无法移出借用的内容“;不使用;到“vec”吗;?,rust,Rust,我正在学习rust,有一个简单的程序,如下所示 #[派生(调试)] pub struct Foo{ 酒吧:字符串, } pub fn gather_foos>{ 让mut-ret:Vec=Vec::new(); 对于0..data.len()中的i{ 如果满足_要求(&数据[i]){ ret.push(数据[i].to_vec()); } } 回程网 } fn符合_要求出现错误是因为您试图将输入向量中的一个向量的所有权移动到输出向量,这是不允许的,因为您已永久借用了输入向量to_vec()创建一

我正在学习rust,有一个简单的程序,如下所示

#[派生(调试)]
pub struct Foo{
酒吧:字符串,
}
pub fn gather_foos>{
让mut-ret:Vec=Vec::new();
对于0..data.len()中的i{
如果满足_要求(&数据[i]){
ret.push(数据[i].to_vec());
}
}
回程网
}

fn符合_要求出现错误是因为您试图将输入向量中的一个向量的所有权移动到输出向量,这是不允许的,因为您已永久借用了输入向量
to_vec()
创建一个副本,这就是为什么在使用它时它可以工作的原因

解决方案取决于你想做什么。如果您不需要原始输入(您只需要匹配的输入),只需通过值而不是引用传递输入,这将允许您使用向量并将项目移动到输出

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


对于其他情况,还有其他选择。如果出于某种原因,您需要数据归多个项目所有,您可以尝试
Rc
Arc
作为参考计数智能指针,这些指针可以被克隆,以提供多个所有者对同一数据的不可变访问。

谢谢您的详细回答!是否存在按值传递而不是按引用传递的性能惩罚?i、 e.示例1会比示例2慢吗?回答我自己的问题,借用的解决方案快了近一个数量级:32 ns/iter比121 ns/iter@亚当,你已经弄明白了,但我会再解释一下性能。按值传递通常较慢,因为它可能涉及将内存中的大量字节移动到函数范围,而引用非常小。此外,我的第一个示例不仅将数据移动到函数中,还将数据移动到函数中:在
for
循环中,项目从原始向量中移出,然后移动到输出向量中(如果不满足条件,则直接删除)。