On Dec 28, 2010, at 18:50 , RichardOnRails wrote:

> In trying to understand the splat operator, I visited:
> http://theplana.wordpress.com/2007/03/03/ruby-idioms-the-splat-operator/
> 
> The first example that site offers is:
>   The split mode :
>   pet1, pet2, pet3 = *["duck","dog","cat"]
> 
> That resulted in pet1 == "duck", etc
> 
> But so did:
>   pet1, pet2, pet3 = ["duck","dog","cat"] # no splat operator
> and#
>   pet1, pet2, pet3 = "duck","dog","cat" # no array-literal markers
> 
> So this first example makes no sense, does it?  What am I missing?

The fact that you're splatting an array doesn't matter, just the fact that you're splatting.

# 1
pet1, pet2, pet3 = *["duck","dog","cat"]

# 2
pet1, pet2, pet3 = ["duck","dog","cat"] # no splat operator

# 3
pet1, pet2, pet3 = "duck","dog","cat" # no array-literal markers

# parses as:
#
# s(:block,
#   # 1
#   s(:masgn,
#     s(:array, s(:lasgn, :pet1), s(:lasgn, :pet2), s(:lasgn, :pet3)),
#     s(:splat, s(:array, s(:str, "duck"), s(:str, "dog"), s(:str, "cat")))),
#   # 2
#   s(:masgn,
#     s(:array, s(:lasgn, :pet1), s(:lasgn, :pet2), s(:lasgn, :pet3)),
#     s(:to_ary, s(:array, s(:str, "duck"), s(:str, "dog"), s(:str, "cat")))),
#   # 3
#   s(:masgn,
#     s(:array, s(:lasgn, :pet1), s(:lasgn, :pet2), s(:lasgn, :pet3)),
#     s(:array, s(:str, "duck"), s(:str, "dog"), s(:str, "cat"))))

# In all 3 cases, you're dealing with a multi-assign w/ an array on LHS.
#
# RHS:
# 1) splatted array
# 2) to_ary array (or any object, see below)
# 3) array (whether you use [] or not, it is still an array literal)

a, b, c = x
a, b, c = *x

# s(:block,
#   # 1
#   s(:masgn,
#     s(:array, s(:lasgn, :a), s(:lasgn, :b), s(:lasgn, :c)),
#     s(:to_ary, s(:call, nil, :x, s(:arglist)))),
#   # 2
#   s(:masgn,
#     s(:array, s(:lasgn, :a), s(:lasgn, :b), s(:lasgn, :c)),
#     s(:splat, s(:call, nil, :x, s(:arglist)))))