无法移出封闭中的借用内容

时间:2019-04-08 12:34:37

标签: rust borrow-checker

这里是生锈的新手。我正在尝试编写一个函数,该函数使用传递的向量,对其进行修改,将其附加到另一个向量并返回它。

这是我的代码:

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。我做错了什么事?闭包传递了什么?

1 个答案:

答案 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甚至可能更有效。