イテレータの要素をフィルタリングして返すやつ
イテレータの中から条件にマッチする要素をフィルタリングして、別のイテレータオブジェクトにつめこみたいとき
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と似た構文だったのでとっつきやすかった。