Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

keep_ifで配列を掃除する

keep_ifメソッドはブロック内の条件に一致した内容を抽出してくれるメソッドです。
似たものに一致した内容を削除するdelete_ifがあります。

使い方

> (1..100).to_a.keep_if {|a| a % 9 == 0}
=> [9, 18, 27, 36, 45, 54, 63, 72, 81, 90, 99]
> ('a'..'z').to_a.keep_if {|a| a =~ /[aiueo]/ }
=> ["a", "e", "i", "o", "u"]

入り込んだ条件を書く事も可能であります。

> [ nil, 'a', 'b', 'c', 'd' ].keep_if {|a| a == nil || a == 'c' }
=> [nil, "c"]

このままだとゴチャゴチャしていて美しくないです。
メソッドにするか、条件のトコをメソッド化して切り出した方が良さそうです。

使用上の注意

一致しなければ空配列を返す

該当がなければ空配列を吐き出します。

> ('1'..'100').to_a.keep_if {|a| a % 9 == 0}
=> []

破壊的メソッドである

便利ですが、破壊的メソッドなので使いどころには注意が必要です。

ary = (1..100).to_a
ary.keep_if{|a| a == 90}  #=> [90]

p ary #=> [90]

参考もと