【问题标题】:How do I filter values from a Vec and still return a Vec? [duplicate]如何从 Vec 过滤值并仍然返回 Vec? [复制]
【发布时间】: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));
}

【问题讨论】:

  • 我认为问题在于您正在尝试从&amp;Word 的迭代器构建Vec&lt;Word&gt;。尝试在 collect 方法之前插入 .cloned()
  • 为了调用into_iter方法,你必须将向量本身传递给函数,而不是对它的引用。
  • 好吧,@Milack27,它似乎有效,谢谢!我必须挖掘它才能了解那里实际发生的事情,但我知道现在该往哪里看。
  • possibleWords 应该采用 &amp;[Word] 而不是 &amp;Vec&lt;Word&gt;。见stackoverflow.com/q/40006219/3650362

标签: filter rust


【解决方案1】:

您在&amp;Vec&lt;Word&gt; 上调用into_iter 方法,这会为您提供Iterator&lt;&amp;Word&gt;。当您尝试从该迭代器中收集元素时,您将得到一个 &amp;Word 的集合,尽管您想要一个 Word 的集合。

您有两种选择来解决此问题:

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

【讨论】:

    猜你喜欢
    • 2020-10-28
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 2020-09-25
    • 2022-06-11
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    相关资源
    最近更新 更多