便利なメソッド 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]