Filter 如何筛选Vec中的值并仍然返回Vec?

Filter 如何筛选Vec中的值并仍然返回Vec?,filter,rust,Filter,Rust,我有一个函数,它接受一个&Vec(其中Word是本地定义的类型),并且应该返回一个Vec(或&Vec)。函数的定义包括从参数中筛选值: fn possibleWords(w1: &Word, words: &Vec<Word>) -> Vec<Word> { words.into_iter().filter(|w| matches(w, w1)).collect::<Vec<Word>>() } 您在&Vec上调用i

我有一个函数,它接受一个
&Vec
(其中
Word
是本地定义的类型),并且应该返回一个
Vec
(或
&Vec
)。函数的定义包括从参数中筛选值:

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

您在
&Vec
上调用
into_iter
方法,这将为您提供一个
迭代器。当您尝试从此迭代器收集元素时,您将获得
&Word
的集合,尽管您需要
Word
的集合

您有两个选项可以修复此问题:

  • 通过克隆每个元素将
    迭代器
    转换为
    迭代器
    (在迭代器上调用
    克隆的
    方法)
  • Vec
    传递给函数,而不是
    &Vec
    。这样,
    into_iter
    方法将返回一个
    迭代器
    ,您可以毫无问题地从中进行收集

  • 我认为问题在于您试图从
    &Word
    的迭代器构建
    Vec
    。尝试在
    collect
    方法之前插入
    .cloned()
    。为了将
    调用到iter
    方法中,必须将向量本身传递给函数,而不是对它的引用。嗯,@Milack27,它似乎可以工作,谢谢!我必须挖掘它来了解那里实际发生了什么,但我知道现在该去哪里看。相关:.
    可能的声音
    应该是
    &[Word]
    而不是
    &Vec
    。看见
    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));
    }