From: Josh Cheek Date: 2010-09-23T04:53:36+09:00 Subject: Re: Odd behavior when << hash --0016363b994e2797760490de8019 Content-Type: text/plain; charset=ISO-8859-1 On Wed, Sep 22, 2010 at 2:33 PM, Alex Stahl wrote: > Hi Folks - Using Ruby 1.8.7, I found this oddity: > > require 'rubygems' > require 'json' > > setup = [] > ids = ["12345", "54321", "21345", "548752", "3215", "50203"] > > doIt = { > "action" => "do something", > "result" => "true" > } > > cnt = rand(10) > 1.upto(cnt) do > > doIt['params'] = ids[rand(6)] > p "Pushing step: #{doIt.inspect}" > setup << doIt > end > > p "Final steps list: #{setup.inspect}" > > ************************************** > > When I inspect my final steps list at the end, the values of > 'doIt['params']' is always the same - set to the last value of the last > run of the upto loop. But when I inspect doIt prior to pushing it, I > can see that it has its own value, acquired randomly. > > So my question is, why is the hash not being pushed onto the array > properly? What side effect am I encountering here and how do I get > around it? > > (I've already tried declaring "params" => "" in the initial hash > creation; that didn't help). > > Thanks, > Alex > > PS - You'd be correct in noting this code doesn't do anything useful. > I've stripped away other parts to isolate the questionable behavior for > demonstration purposes. > > > You are modifying the same hash, then adding the same hash to the array again. In other words, there is only ever one hash in your program (and data is mutable in Ruby). To analogize, if you record my address ten times, painting my shutters a different after each, then decide to visit each of the ten addresses that you have written down, you will find that all of the houses you visit will have the same colour of shutters as the final time you painted my house. I have modified the program to hopefully make this clearer. http://codepad.org/ZPB7UC6Q --0016363b994e2797760490de8019--