2016-12-01 7 views
2

Option<Vec<>>を繰り返し処理しようとしています。イテレーターオンオプション<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最初のラップを解除すべきであると考えています。

次に、常に1つの参照がある場合はOption::iterを実際に使用できる場所はわかりません。

Hereは、プレイグラウンドへのリンクです。

+1

何が質問ですか? – Lee

+0

どちらの場合にOption <>。iter()を使うべきなのか分かりませんが、たぶん1つの項目を返すという誤った感じがします。 –

+0

@XavierT。 'Option :: iter'は、オプションをゼロ要素のコンテナとして扱う場合に設計されています。それは私にとってもあまり有益ではないように思われますが、それは考え方です。 – user4815162342

答えて

5

Optionは、(オプションがNone場合)「おそらく含まれる値を反復」は、すなわちOptionで単一の値(オプションがある場合Some)、又は全くの値のいずれかを提供iter methodことを有​​します。このようにオプションをコンテナとして扱いたい場合は、Noneはコンテナが空であることを意味し、Someはそれが単一の要素を含むことを意味します。基本となる要素の値を反復するために

、あなたはプログラムがNone人に遭遇したとき反復するためにパニックたりしないようにしたいかに応じて、foo.people.unwrap().iter()またはfoo.people.unwrap_or_else(Vec::new).iter()のいずれかにfoo.people.iter()から切り替える必要があります。

コンパイル可能な例in the playground

+2

'unwrap'の代わりに' let let Some(ref v)= foo.people {} 'を単純にラップすることもできます。 –

+0

@kerこれはもう一つの選択肢ですが、別のインデントレベルが必要ですループ。 'unwrap()'は、コードが実際にオプションが '非 'であると予想し、それをアサートしようとしているときには依然として有効です。 – user4815162342

+2

私はいつも '' foo.people.iter() '' flat_map(| v | v.iter()) ''を実行したければ、 '' None''は空のイテレータを返します。ベクトルの要素 – Lukazoid

関連する問題