>Take a look at this for some clues: > > $ irb > irb(main):001:0> events = {} > => {} > irb(main):002:0> events.default = [] > => [] > irb(main):003:0> events["trying"] << "hello" > => ["hello"] > irb(main):004:0> events.default > => ["hello"] > irb(main):005:0> events["test"] > => ["hello"] > >In short, what's happening is that when you call events["trying"] at >statement 3, it returns the default value, which is an array. You then >insert "hello" into that array and *change the default value*. Since >you never assigned to events["trying"], it still doesn't exist. You >were only getting the expected value back on re-access because of the >changed default value. > >Try this instead: > > $ irb > irb(main):001:0> events = Hash.new{ |h,k| h[k] = [] } > => {} > irb(main):002:0> events.default > => [] > irb(main):003:0> events["trying"] << "hello" > => ["hello"] > irb(main):004:0> events.default > => [] > irb(main):005:0> events["trying"] > => ["hello"] > irb(main):006:0> events["test"] > => [] > irb(main):007:0> events > => {nil=>[], "test"=>[], "trying"=>["hello"]} > >This produces the desired behavior, but you have to be careful, since >accessing non-existent keys will pollute the keys of your hash. > >-- >Jacob Fugal > > > Oh thanks, i really had a misunderstood on that point.