便利なメソッド map, group_by, enum_for, inject

勉強会に参加してrubyの便利なメソッドを使った書き方を学んだのでメモする。

map

配列の要素に操作をする場合に使う。

"abcdef".split.map{|e| e.capitalize} => "A","B","C","D","E","F"
"abcdef".split.map{|e| e.capitalize}.min => "A"

group_by

配列をブロックで指定した方法でグループ分けしてハッシュを返す
※以下は文字列を2桁ずつで区切り、その数字の値でグループ分けしたもの

"H6D2S2C7D7H7S1".scan(/../).map{|e|e[1,1]}.group_by{|e|e}
=> {"6"=>["6"], "7"=>["7", "7", "7"], "1"=>["1"], "2"=>["2", "2"]}

hashにvaluesをつけるとその値の配列が返される

"H6D2S2C7D7H7S1".scan(/../).map{|e|e[1,1]}.group_by{|e|e}.values
=> [["6"], ["7", "7", "7"], ["1"], ["2", "2"]]

mapに&つきのシンボルを渡すことができる

"H6D2S2C7D7H7S1".scan(/../).map{|e|e[1,1]}.group_by{|e|e}.values.map(&:size)
=> [1, 3, 1, 2]

enum_for

enum_forを使うことでenumeratorオブジェクトを作成できる。

val_ary = "H6D2S2C7D7H7S1".enum_for(:scan, /[HDSC](\d+)/).to_a.flatten
=> ["6", "2", "2", "7", "7", "7", "1"]

inject

injectはeachで配列の値を合計する等の処理を省略してかける.引数は初期値で省略すると配列の先頭要素になる。

(0..10).inject(0){|sum,e| sum += e}
=> 55

フィボナッチ数列もこんなに簡単にかける

(0..10).inject([1,1]){|fib, i| fib << fib[i] + fib[i+1]}
=> [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233]