我有一个函数需要&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));
}
答案 0 :(得分:1)
您在into_iter
上调用了&Vec<Word>
方法,它会为您提供Iterator<&Word>
。当您尝试从此迭代器中收集元素时,您将获得&Word
的集合,尽管您需要Word
的集合。
您有两种方法可以解决此问题:
Iterator<&Word>
转换为Iterator<Word>
(在迭代器上调用cloned
方法); Vec<Word>
传递给该函数,而不是&Vec<Word>
。这样,into_iter
方法将返回Iterator<Word>
,您可以从中收集没有任何问题。