basyura's blog

あしたになったらほんきだす。

Hash.new([]) にたまにハマる

Array#inject でキーに対する値を配列で持つ Hash を生成する際に、

m = ["a","a","b","b"].inject(Hash.new([])){|map,v|
  map[v] << v.upcase
  map
}
p m
#=> {}

としちゃって返ってきた Hash が空でたまにハマる。

デフォルト値として、毎回同一のオブジェクトifnoneを返します。

class Hash

上の例だと

p m.default
#=> ["A","A","B","B"]

となって、ifnone に全て突っ込まれてしまっている。
別に初期処理をかませばいいんだけど、これまた () を省略してまたハマったりする。

m = ["a","a","b","b"].inject(Hash.new){|map,v|
  (map[v] ||= []) << v.upcase
  map
}
p m
#=> {"a"=>["A", "A"], "b"=>["B", "B"]} 
p m.default
#=> nil