From: Jonah Bloch-Johnson Date: 2008-08-20T11:38:55+09:00 Subject: Re: Nested Arrays in Method Definitions--a puzzle Many many many thanks, Adam and Martin! I do think this clears it up. Quoting Adam Shelly : > On 8/19/08, Jonah Bloch-Johnson wrote: > >> I am writing because I am somewhat stumped by why the following >> discrepency occurs... > > Variables and Array entries hold references to objects. > > irb(main):001:0> x=[1] > => [1] > irb(main):002:0> x.object_id > => 20774910 > > irb(main):003:0> y=[];y< => [[1]] > irb(main):004:0> y[0].object_id > => 20774910 #the same object that x referrs to > > irb(main):005:0> x=[2] > => [2] > irb(main):006:0> x.object_id > => 21222360 #now x refers to the newly created array > > irb(main):008:0> y > => [[1]] > irb(main):007:0> y[0].object_id > => 20774910 #but y still holds a reference to the old one. > > irb(main):009:0> y=[x] > => [[2]] > irb(main):010:0> y[0].object_id > => 21222360 #y[0] is now a reference to the same Array as x > > irb(main):011:0> x[0]=4 > => 4 > irb(main):013:0> y > => [[4]] #so changes to the content of that Array are visible > through y's reference. > > > hope this helps, > -Adam > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >> x = [1] > > [1] is an Array object, x is a variable referring to that array >> y = [] > y referrs to a 2nd Array >> y << x > > And now that array contains a reference to > >> x = [2] # (compare this) > > Here you are creating an array, labeling it 'x', and storing a > reference to it in the array labeled y. Then you reassign the 'x' > label to yet another array (the one containing 2). > >> end >> def havenots >> x = [1] >> y = [] >> y << x >> x[0] = 2 # (to this) >> y >> end >> end >> >> I get this in irb: >> >> > >> > > load 'snah.rb' >> > > >> > >> => true >> > >> > > a = Warfare.new >> > > >> > >> => # >> > >> > > a.haves >> > > >> > >> => [[1]] >> > >> > > a.havenots >> > > >> > >> => [[2]] >> >> Why does meddling with the innards of the "x" have retroactive >> repercussions, whereas redefining it outright does not? >> >> Any insight would be greatly appreciated. >> >> -Jonah >> >> >> > >