zakihayaメモ

RubyとRailsのことが中心

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
=> {}