今日ハマって時間を無駄にしたこと: 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のイテレータの網羅的かつ大雑把な紹介 という記事でもこのことは言及されていました.