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

时间:2018-04-30 13:26:29

标签: filter rust

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

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

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

error[E0277]: the trait bound `std::vec::Vec<[char; 10]>: std::iter::FromIterator<&[char; 10]>` is not satisfied

words.into_iter().filter(|w| matches(w, w1)).collect::<Vec<Word>>()
                                             ^^^^^^^ a collection of type `std::vec::Vec<[char; 10]>` cannot be built from an iterator over elements of type `&[char; 10]`

我不想返回切片,我真的想要一个Vec。有没有办法在不从切片手动构建Vec的情况下执行此操作?

这是一个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));
}

1 个答案:

答案 0 :(得分:1)

您在into_iter上调用了&Vec<Word>方法,它会为您提供Iterator<&Word>。当您尝试从此迭代器中收集元素时,您将获得&Word的集合,尽管您需要Word的集合。

您有两种方法可以解决此问题:

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