如何从 Vec 过滤值并仍然返回 Vec?

Fab*_*ien 3 filter rust

我有一个函数,它采用 a &Vec<Word>(其中Word是本地定义的类型)并且应该返回 a Vec<Word>(或 a &Vec<Word>)。该函数的定义包括从参数中过滤值:

fn possibleWords(w1: &Word, words: &Vec<Word>) -> Vec<Word> {
    words.into_iter().filter(|w| matches(w, w1)).collect::<Vec<Word>>()
}
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误消息:

fn possibleWords(w1: &Word, words: &Vec<Word>) -> Vec<Word> {
    words.into_iter().filter(|w| matches(w, w1)).collect::<Vec<Word>>()
}
Run Code Online (Sandbox Code Playgroud)

我不想返回切片,我真的想要一个Vec. 有没有办法在不Vec从切片中手动构建 a 的情况下做到这一点?

这是一个 MCVE:

type Word = [char; 10];

fn matches(w1: &Word, w2: &Word) -> bool {
    true
}

fn possibleWords(w1: &Word, words: &Vec<Word>) -> Vec<Word> {
    words.into_iter().filter(|w| matches(w, w1)).collect::<Vec<Word>>()
}


fn main() {
    let w1 = ['D', 'E', 'C', 'O', 'U', 'V', 'E', 'R', 'T', 'E'];
    let w2 = ['D', 'E', 'C', 'O', 'U', 'V', 'E', 'R', 'E', 'Z'];
    let words = vec![w1, w2];
    println!("{:?}", possibleWords(&w1, &words));
}
Run Code Online (Sandbox Code Playgroud)

Mil*_*k27 5

您正在 a 上调​​用该into_iter方法&Vec<Word>,它会给您一个Iterator<&Word>. 当您尝试从该迭代器中收集元素时,您将获得一个集合,&Word尽管您想要一个Word.

您有两个选择来解决这个问题:

  1. 通过克隆每个元素将 the 转换Iterator<&Word>为 an Iterator<Word>(调用cloned迭代器上的方法);
  2. 将 a 传递Vec<Word>给函数,而不是 a &Vec<Word>。这样,该into_iter方法将返回一个Iterator<Word>,您可以毫无问题地从中收集。