Rust collectついて

July 12, 2021

これ何

rustlings の iterators3.rs のこの挙動。

>> vec![27, 297, 38502, 81].into_iter().map(|n| divide(n, 27) ).collect::<Vec<_>>()
[Ok(1), Ok(11), Ok(1426), Ok(3)]
>> vec![27, 297, 38502, 81].into_iter().map(|n| divide(n, 27) ).collect::<Result<Vec<_>, DivisionError>>()
Ok([1, 11, 1426, 3])

collect の型パラメータによって戻り値が変わる。

Err が混じってる場合。

>> vec![27, 297, 38502, 81, 28].into_iter().map(|n| divide(n, 27) ).collect::<Vec<_>>()
[Ok(1), Ok(11), Ok(1426), Ok(3), Err(NotDivisible(NotDivisibleError { dividend: 28, divisor: 27 }))]
>> vec![27, 297, 38502, 81, 28].into_iter().map(|n| divide(n, 27) ).collect::<Result<Vec<_>, DivisionError>>()
Err(NotDivisible(NotDivisibleError { dividend: 28, divisor: 27 }))

collect

https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect

>> (0..20).map(|n| if n%2 == 1 { Some(n)} else {None}).collect::<Vec<_>>()
[None, Some(1), None, Some(3), None, Some(5), None, Some(7), None, Some(9), None, Some(11), None, Some(13), None, Some(15), None, Some(17), None, Some(19)]

>> vec![1,3,5].into_iter().map(|n| if n%2 == 1 { Some(n)} else {None}).collect::<Option<Vec<_>>>()
Some([1, 3, 5])


Profile picture

あさくち Webエンジニアっぽい仕事をしている Twitter