From: Robert Klemme Date: 2005-02-17T20:59:48+09:00 Subject: Re: A little bit confused about array+array addition (bug or expected behavior?) "Assaph Mehr" schrieb im Newsbeitrag news:1108596235.249240.166770@z14g2000cwz.googlegroups.com... > > gga wrote: > > > > irb(main):082:0> def add(x) > > irb(main):084:1> x += [5,6] > > irb(main):085:1> end > > > > irb(main):087:0> add(a) > > => [1, 2, 3, 4, 5, 6] > > irb(main):088:0> a > > => [1, 2, 3, 4] ===>>> uh? am I not passing stuff by > reference? > > where is 5, 6? > > In the method body you are reassing to the local variable x. > . x += [...] > is translated to: > . x = x + [...] > and #+ as we all know returns a copy of the object. > > You can see this with: > > . def add(x) > . puts "Before #{x.object_id}" > . x += [5,6] > . puts "After #{x.object_id}" > . end > > So you ARE passing by ref, but then changing the ref to point to > anotehr object. > > > irb(main):089:0> def add2(x) > > irb(main):089:0> x << [5,6] > > irb(main):089:0> end > > > > irb(main):090:0> add2(a) > > => [1, 2, 3, 4, [5, 6]] > > irb(main):091:0> a > > => [1, 2, 3, 4, [5, 6]] ==> seems logical, but then .... why += > > behaves differently? > > The METHOD #<< modifies the object in place. The SYNTACTIC SUGAR += is > changing a objeced referred to. Alternative is #concat >> a=[1,2] => [1, 2] >> def add3(a) a.concat [3,4] end => nil >> add3 a => [1, 2, 3, 4] >> a => [1, 2, 3, 4] Regards robert