Rust 可选迭代器默认值

mentoc3000

我有一个可选值的自定义可选迭代器。如果该值是,None我想提供一个默认的None迭代器但是,我无法获得匹配的类型。下面是一个简化的例子有关如何处理此问题的任何建议?

use std::iter;

fn main() {
    let i = Some(vec![Some(1), Some(2), Some(3)]);
    let x = i.unwrap_or(iter::repeat(None).take(3));
    for y in x {
        println!("{:?}", y);
    }
}
   Compiling playground v0.0.1 (/playground)
error[E0308]: mismatched types
 --> src/main.rs:5:25
  |
5 |     let x = i.unwrap_or(iter::repeat(None).take(3));
  |                         ^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `Vec`, found struct `std::iter::Take`
  |
  = note: expected struct `Vec<Option<{integer}>>`
             found struct `std::iter::Take<std::iter::Repeat<Option<_>>>`
泽塔

这取决于x应该是 anIterator还是 a Vec

迭代器

let x = i.into_iter().flatten().chain(iter::repeat(None)).take(3);

以下是每一步的解释:

  1. into_iter()从我们的Option. 我们的next()调用将返回整个Vec.
  2. flatten迭代Vec它的所有元素
  3. chain(iter::repeat(None))None在迭代中添加无限的s
  4. take(3) 将元素的总数限制为三个。

但是,这假设您希望始终只有三个元素,并且要么限制s ,要么VecNones填充它

维克

由于take(3)返回一个迭代器,但在现有向量上unwrap_or返回 a Vec,我们需要将迭代器转换为 a Vecvia collect()

let x = i.unwrap_or(iter::repeat(None).take(3).collect());

现在类型匹配。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章