イテレータの要素をフィルタリングして返すやつ

イテレータの中から条件にマッチする要素をフィルタリングして、別のイテレータオブジェクトにつめこみたいとき
Rubyではselectというメソッドをつかって簡単に書くことができる

array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
a_result = array.select { |n| n%3 == 0 }
a_result == [3, 6, 9] // => true

hash = {apple: 2, banana: 1, orange: 4}
h_result = hash.select { |k, v| v > 3 } 
h_result == {orange: 4} // => true

イテレータの要素をクロージャの引数に渡し、戻り値が真だった時の要素をつめたオブジェクトを返している

Rustではfilter()という名前で実装されている
引数でクロージャをとり、イテレータを返すメソッドだ

use std::collections::HashMap; //連想配列は標準ライブラリで提供されてるのでrequireする

let v = vec![1u8, 2, 3, 4, 5, 6, 7, 8, 9];
let v_result: Vec<u8> = v.iter().filter(|&x| x % 3u8 == 0).cloned().collect();
assert_eq!(vec![3, 6, 9], v_result);

let hash: HashMap<&str, i8> = [("apple", 2), ("banana", 1), ("orange", 4) ].iter().cloned().collect();
let h_result: HashMap<_, _> = hash.iter().filter(|(&k, &v)| v > 3).collect();
assert_eq!("orange".to_string(),    h_result.keys().nth(0).unwrap().to_string());

Rubyと似た構文だったのでとっつきやすかった。