可以从迭代器中收集 &mut 吗?

It is possible to collect a &mut from an iterator?

我想了解更多关于所有权的信息。这是一些不起作用的代码,因为 collect 不允许您获得 &mut String:

fn search(word: &str, data: &mut Vec<String>) {
    data = data
        .iter()
        .filter(|x| x.contains(word))
        .collect::<&mut Vec<String>>();
}

我想我可以 return 一个克隆版本,但这是 only/preferred 的方式吗?

不,这是不可能的。为此,collect 必须 return 对其创建的内容的引用,并且 that's not possible.

您正在寻找Vec::retain

fn search(word: &str, data: &mut Vec<String>) {
    data.retain(|x| x.contains(word));
}

如果您不想改变传入的数据,您确实需要 return 一个新的 Vec:

fn search<'a>(word: &str, data: &'a [String]) -> Vec<&'a String> {
    data.iter().filter(|x| x.contains(word)).collect()
}

另请参阅:

  • Is there any way to return a reference to a variable created in a function?