【问题标题】:Cannot move out borrowed content inside closure [duplicate]无法在闭包内移出借来的内容[重复]
【发布时间】:2019-08-29 14:46:07
【问题描述】:

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

这是我的代码:

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
}

但是,我在t.0 收到了cannot move out borrowed content。我做错了什么?什么被传递到闭包中?

【问题讨论】:

  • .iter() 返回一个迭代器,指向向量中每个元素的引用。你似乎想要into_iter()
  • res 有什么意义?为什么不直接返回neg
  • @E_net4 我不会把这个问题称为重复问题。您链接的那个问题只会问您是否已经知道应该在此处使用into_iter。不过,这个问题的答案非常相关。 (另外,这里最好的解决方案其实是根本不使用into_iter,而只是修改原始向量并返回。)
  • @M-ou-se 这是选择重复目标时真正重要的答案。重复的问题并不意味着目标问题完全相同,但它的答案也解决了该问题。至于它是否是一个好的重复目标,我将把决定权留给剩下的选民。
  • 非常感谢。我同意cmets。问题是要知道在这种情况下要使用 into_iter。

标签: rust borrow-checker


【解决方案1】:

t.0 尝试将Stringt 引用的元组中移动,但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
}

重复使用Strings 可能更有效,而不是使用String::from 创建新的。

【讨论】:

  • 您的答案与建议的重复 What is the difference between iter and into_iter? 有何不同?
  • @hellow 这个问题只处理第一部分。在这种情况下,表明 into_iter()collect() 不是最佳选择是该问题/答案中未处理的非常相关的部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 2016-09-15
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
相关资源
最近更新 更多