我有一个可选值的自定义可选迭代器。如果该值是,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);
以下是每一步的解释:
into_iter()
从我们的Option
. 我们的next()
调用将返回整个Vec
.flatten
迭代Vec
它的所有元素chain(iter::repeat(None))
None
在迭代中添加无限的stake(3)
将元素的总数限制为三个。但是,这假设您希望始终只有三个元素,并且要么限制s ,要么Vec
用None
s填充它。
由于take(3)
返回一个迭代器,但在现有向量上unwrap_or
返回 a Vec
,我们需要将迭代器转换为 a Vec
via collect()
:
let x = i.unwrap_or(iter::repeat(None).take(3).collect());
现在类型匹配。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句