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. HTH, Assaph