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