今日ハマって時間を無駄にしたこと: Result<T, E>
は IntoIterator
です. .into_iter()
すると, Ok(_)
なら 1 回だけ中身を返し, Err(_)
なら何も返さないイテレータとして使えます.
公式ドキュメント からの例 (を改変した例). 例えばこのコードは 1 回だけ 5
を表示します.
fn main() {
let iter: Result<i32, &str> = Ok(5);
for x in iter {
println!("{}", x);
}
}
Err(_)
にすると何も表示しません.
fn main() {
let iter: Result<i32, &str> = Err("This is an error.");
for x in iter {
println!("{}", x);
}
}
ちなみに &Result<T, E>
, Option<T>
, &Option<T>
, &mut Option<T>
も IntoIterator
なので同じ使い方ができます.
よく考えると, Vec<T>
とか HashMap<K, V, S>
が IntoIterator
であるのと同じように, これらも中に要素を持つインスタンスですから IntoIterator
であるのがある意味自然なのかもしれません.
参考文献
Rustのイテレータの網羅的かつ大雑把な紹介 という記事でもこのことは言及されていました.