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)))))