选项<vec <>&gt;上的迭代器

时间:2016-12-01 10:16:19

标签: rust

我正在尝试重复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是游乐场的链接。

4 个答案:

答案 0 :(得分:5)

remote branchiter method&#34;迭代可能包含的值&#34;,即提供Option中的单个值(如果选项为{{1} }},或根本没有值(如果选项是Option)。因此,如果您希望将选项视为容器,Some表示容器为空,None表示它包含单个元素,则此选项非常有用。

要迭代基础元素的值,您需要从None切换到Somefoo.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_derefOption::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
    }
}