【发布时间】:2018-10-10 14:38:23
【问题描述】:
我有一个函数接受 &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));
}
【问题讨论】:
-
我认为问题在于您正在尝试从
&Word的迭代器构建Vec<Word>。尝试在collect方法之前插入.cloned()。 -
为了调用
into_iter方法,你必须将向量本身传递给函数,而不是对它的引用。 -
好吧,@Milack27,它似乎有效,谢谢!我必须挖掘它才能了解那里实际发生的事情,但我知道现在该往哪里看。
-
possibleWords应该采用&[Word]而不是&Vec<Word>。见stackoverflow.com/q/40006219/3650362