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

5

我有一个函数,它接受一个 &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));
}

3
我认为问题在于您试图从一个&Word的迭代器中构建一个Vec<Word>。尝试在collect方法之前插入.cloned() - Milack27
1
为了调用 into_iter 方法,你必须将向量本身传递给函数,而不是它的引用。 - Milack27
嗯,@Milack27,看起来它能工作,谢谢!我得深入了解一下那里实际上发生了什么,但现在我知道该去哪里找了。 - Fabien
1
possibleWords 应该使用 &[Word] 而不是 &Vec<Word>。请参见 https://dev59.com/W1kS5IYBdhLWcg3wV1Zy。 - trent
1个回答

7
您正在调用 &Vec<Word> 上的 into_iter 方法,这将给您一个 Iterator<&Word>。当您尝试从迭代器收集元素时,您将得到 &Word 的集合,尽管您想要的是 Word 的集合。
您有两个选项来解决这个问题:
  1. 通过克隆每个元素(在迭代器上调用 cloned 方法),将 Iterator<&Word> 转换为 Iterator<Word>
  2. 向函数传递 Vec<Word> 而不是 &Vec<Word>。这样,into_iter 方法将返回一个 Iterator<Word>,您可以轻松收集其中的元素。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接