这里是生锈的新手。我正在尝试编写一个函数,该函数使用传递的向量,对其进行修改,将其附加到另一个向量并返回它。
这是我的代码:
fn try(other: Vec<(String, String)>) -> Vec<(String, String)> {
let mut res = Vec::new();
let mut neg: Vec<(String,String)> = other
.iter()
.map(|t| (t.0, String::from("abc")))
.collect();
res.append(&mut neg);
res
}
但是,我在cannot move out borrowed content
收到t.0
。我做错了什么事?闭包传递了什么?
答案 0 :(得分:1)
t.0
试图从String
引用的元组中将t
移出,但是t
仅借用它。这是因为.iter()
为您提供了一个迭代器,该迭代器为您提供了对值的引用。如果您使用into_iter()
而不是iter()
,那么您将消费所有other
的值,而不仅仅是获取它们的借用 ,因为other.into_iter()
消耗other
。
在您的特定示例中,完全重用other
而不是使用内容(部分)取自Vec
的内容创建新的other
,然后删除它会更有效other
:
fn try2(mut other: Vec<(String, String)>) -> Vec<(String, String)> {
for x in &mut other {
x.1 = String::from("abc");
}
other
}
与重用String
相比,重用String::from
甚至可能更有效。