From: "David A. Black" Date: 2008-03-25T12:55:35+09:00 Subject: Re: hash of arrays - appending to one of the arrays Hi -- On Tue, 25 Mar 2008, Adam Akhtar wrote: > Hi Ive done a search on this and there have been quite a few posts which > have incresed my knowlege somewhat but still have a few questions. > > Im creating a hash of arrays. The keys and values are added within a > loop. For each key there may be multiple values hence the need for an > array as a value. Values for a key are found over interations of a loop. > I therefore have to append a new found value to the existing values in > an array. > > I tried doing this > > something.each do |blah| > if (test something) > hash[key] = hash[key] + value > end > end > > but the compliler complains about there being no method for nil class. > > I read the basic way to do this would be > > hash[key] = [] #create blank array > hash[key] = hash[key] + value > > but as im in a loop that would require me to do a check to see if the > key exists or not. If im processing lots of informatino that would slow > me down a bit. > > IS there a slicker way of doing this? The most common idiom is: (hash[key] ||= []) << value You can also make a hash that has a default behavior, for non-existent keys, of putting an array at that key: irb(main):004:0> hash = Hash.new {|h,k| h[k] = [] } => {} irb(main):005:0> hash[1] << 2 => [2] irb(main):006:0> hash => {1=>[2]} David -- Upcoming Rails training from David A. Black and Ruby Power and Light: ADVANCING WITH RAILS April 14-17 New York City INTRO TO RAILS June 9-12 Berlin ADVANCING WITH RAILS June 16-19 Berlin CORE RAILS June 24-27 London (Skills Matter) See http://www.rubypal.com for more info!