Hash#mapとHash#selectのブロック引数の違いでハマる
ブロック引数が1つのmapで作っていたソースをコピーしてselectをやろうとしたら
うまくいかなくて困った。
Hash#mapはブロック引数が1つの時と2つの時で挙動が違う
- 引数が1つの時
keyとvalueが配列に入ってくる
{a: 1, b: 2, c: 3}.map{|val1| puts "val1=#{val1.inspect}"} val1=[:a, 1] val1=[:b, 2] val1=[:c, 3] => [nil, nil, nil]
- 引数が2つの時
1つ目の引数にkey、2つ目の引数にvalueが入ってくる
{a: 1, b: 2, c: 3}.map{|val1, val2| puts "val1=#{val1.inspect} val2=#{val2.inspect}"} val1=:a val2=1 val1=:b val2=2 val1=:c val2=3 => [nil, nil, nil]
Hash#selectはブロック引数が1つの時も2つの時も同じ挙動
1つ目の引数にkey、2つ目の引数にvalueが入ってくる
- 引数が1つの時
{a: 1, b: 2, c: 3}.select{|val1| puts "val1=#{val1.inspect}"} val1=:a val1=:b val1=:c => {}
- 引数が2つの時
pry(main)> {a: 1, b: 2, c: 3}.select{|val1, val2| puts "val1=#{val1.inspect} val2=#{val2.inspect}"} val1=:a val2=1 val1=:b val2=2 val1=:c val2=3 => {}