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

Dan*_*uno 3 iterator vector ownership rust

我想了解更多有关所有权的信息.这是一些不起作用的代码,因为collect不会让你得到&mut String:

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

我想我可以返回一个克隆版本,但这是唯一/首选的方法吗?

She*_*ter 7

不,这是不可能的.为了实现这一点,collect必须返回对它创建的东西的引用,这是不可能的.

您正在寻找Vec::retain:

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

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

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

也可以看看: