我正在尝试重复Option<Vec<>>
。
#[derive(Debug)]
pub struct Person {
pub name: Option<String>,
pub age: Option<u64>,
}
#[derive(Debug)]
pub struct Foo {
pub people: Option<Vec<Person>>,
}
我正在使用
for i in foo.people.iter() {
println!("{:?}", i);
}
我实际上显示的是整个Vec
,而不是遍历Vec
的所有元素。这就像我在迭代Option
的唯一引用。
使用以下内容,我将迭代Vec
内容:
for i in foo.people.iter() {
for j in i.iter() {
println!("{:?}", j);
}
}
我不确定这是最令人愉快的语法,我相信你应该首先解开Option
来实际迭代集合。
如果您总是只有一个参考文献,那么我就不知道您可以在哪里使用Option::iter
。
Here是游乐场的链接。
答案 0 :(得分:5)
remote branch
有iter
method&#34;迭代可能包含的值&#34;,即提供Option
中的单个值(如果选项为{{1} }},或根本没有值(如果选项是Option
)。因此,如果您希望将选项视为容器,Some
表示容器为空,None
表示它包含单个元素,则此选项非常有用。
要迭代基础元素的值,您需要从None
切换到Some
或foo.people.iter()
,具体取决于您是否希望程序出现紧急情况在遇到foo.people.unwrap().iter()
人时进行迭代。
可编辑示例in the playground。
答案 1 :(得分:5)
如对另一个答案的评论中所述,我将使用以下内容:
foo.people.iter().flat_map(identity)
iter
上的Option<T>
方法将返回一个元素或零元素的迭代器,然后flat_map
接受每个元素(在这种情况下为Vec<Person>
)并展平其嵌套元素产生Iterator<Item = Person>
。
答案 2 :(得分:3)
使用 Option::as_deref
和 Option::unwrap_or_default
:
for i in foo.people.as_deref().unwrap_or_default() {
println!("{:?}", i);
}
Option::as_deref
将 &Option<Vec<T>>
转换为 Option<&[T]>
,然后 unwrap_or_default
返回 &[T]
或默认值(空切片)。然后您可以直接对其进行迭代。
另见:
答案 3 :(得分:2)
如果您不需要带有 IntoIterator
实现的实际值,您可以使用显式 if let
代替:
if let Some(x) = foo.people {
for i in x {
// work with i here
}
}