From: 7stud -- Date: 2009-09-11T10:07:42+09:00 Subject: Re: populating a hash from an array using inject 7stud -- wrote: > Sorry, I pasted the ri output on top of the first part of my post, which > said something to the effect of: > >> My question: why is bar empty? > > ...because h[non_existent_key] sends an array that is unassociated with > any hash to the block. In other words, creating a hash with a default > value does not cause a key/value pair to be created in the hash when a > non-existent key is accessed. It was probably best that first sentence was erased. Here is what I was trying to say: h = Hash.new([]) result = h["A"] p result --output:-- [] p h --output:-- {} When you write: h[p.category] << p The example above demonstrates that is equivalent* to: [] << p ...and that simply appends an object to an empty array, and does nothing to the hash. And you are in even worse shape than you realize. If you take the empty array that is returned as the default value and append an object to the array, and then manually assign the array to a key in the hash: h = Hash.new([]) h["A"] = h["A"] << 10 #==>[10] h["B"] = h["B"] << 20 #==>[20] Look what happens: p h {"A"=>[10, 20], "B"=>[10, 20]} Yep, ruby hands you a reference to the same array over and over again. -- Posted via http://www.ruby-forum.com/.