Thanks for this Robert.

The difference between the two is exactly why I wanted to use += and
not <<.  I want to add many arrays to one big one and not have to use
the extra step of Array#flatten at the end.

SM



On 10/12/07, Robert Klemme <shortcutter / googlemail.com> wrote:
> 2007/10/12, mortee <mortee.lists / kavemalna.hu>:
> > Simon Mullis wrote:
> > >>> (a ||= []) << [1, 2, 3, 4]
> > > => [[1, 2, 3, 4]]
> > >
> > > But
> > >
> > >>> ( a ||= [] ) += [ 1, 2, 3, 4 ]
> > > SyntaxError: compile error
> > > (irb):28: syntax error, unexpected tOP_ASGN, expecting $end
> > > ( a ||= [] ) += [ 1, 2, 3, 4 ]
> > >                ^
> > >         from (irb):28
> > >
> > > Why?
> > >
> > > I guess it's a precedence issue. '<<' is a method in the Array class.
> > > '+=' is not.
>
> No, it's not a precedence issue.  Btw, you are comparing apples and
> oranges here: += and << are not equivalent (see also further below):
>
> irb(main):001:0> a=%w{foo bar}
> => ["foo", "bar"]
> irb(main):002:0> b=a.dup
> => ["foo", "bar"]
> irb(main):003:0> c=a.dup
> => ["foo", "bar"]
> irb(main):004:0> b << a
> => ["foo", "bar", ["foo", "bar"]]
> irb(main):005:0> c += a
> => ["foo", "bar", "foo", "bar"]
>
> << adds the whole Array as one object while += "appends" the Array.
> You rather want Array#concat.
>
> > The difference is that << is a method, += is an assignment. (a ||= [])
> > returns an object, on which you can call a method, but you can't assign
> > to. You can only assign to the a variable itself, which (a ||= []) is
> > not. I guess.
>
> Exactly: the expression (a||=[]) is not an lvalue, i.e. cannot
> assigned to.  But you can do
>
> ( a ||= [] ).concat [ 1, 2, 3, 4 ]
>
> Simon, please also keep in mind that += and << have different
> semantics. += will create a new Array while << appends to the current
> one.
>
> Kind regards
>
> robert
>
>


-- 
Simon Mullis
_________________
simon / mullis.co.uk