On Dec 18, 2005, at 8:38 AM, Ross Bamford wrote:

> On Sun, 18 Dec 2005 12:58:09 -0000, Stefan Lang <langstefan / gmx.at>  
> wrote:
>
>> On Sunday 18 December 2005 13:43, Steve Litt wrote:
>>> On Sunday 18 December 2005 04:46 am, Florian Frank wrote:
>>> > Steve Litt wrote:
>>> > >I converted the array of arguments to a string, and it worked.
>>> > > But it should have worked the other way too. What am I missing?
>>> >
>>> > exec *argarray
>>>
>>> Confirmed! Thanks Florian.
>>>
>>> Now I can run a command with several words quoted together to make
>>> one argument.
>>>
>>> Curious -- what does the asterisk do to make it work when it didn't
>>> work without the asterisk. What does the asterisk do? I know it
>>> doesn't mean "the contents of this address" -- that's another
>>> language :-)
>>
>> It flattens the array (argarray) into an argument list.
>> This means the first element of argarray becomes the first
>> argument to exec, the second element of argarray becomes
>> the second argument to exec and so on.
>>
>
> I've seen it also called the 'splat' operator, and (I think?) David  
> Black called it the 'unary unarray' operator, which I a good name  
> for it. It doesn't just work with method arguments, and it doesn't  
> just work with arrays:
>
> 	p = *File.open('/etc/passwd')
>
> gives an array of all the lines in the file. I was most impressed  
> when I found that out recently ;)
>
> (p.s. I'm not advocating that method of reading files _at all_ -  
> it's just an example)
>
> -- 
> Ross Bamford - rosco / roscopeco.remove.co.uk
>

This scared me, so I did some experiments
logan:/Users/logan% irb
irb(main):001:0> lines = *File.open('test.yml')
=> ["---\n", "words:\n", "  - yes\n", "  - put\n", "  - it\n", "  - on 
\n", "  - the\n", "  - off\n", "  - setting\n"]
irb(main):002:0> h = { :a=>:b, :c=>:d }
=> {:a=>:b, :c=>:d}
irb(main):003:0> keysvals =  *h
=> [[:a, :b], [:c, :d]]
irb(main):004:0> class Q
irb(main):005:1>   def to_a
irb(main):006:2>       "Hello!"
irb(main):007:2>   end
irb(main):008:1> end
=> nil
irb(main):009:0> q = Q.new
=> #<Q:0xc13e4>
irb(main):010:0> qarray = *q
TypeError: `to_a' did not return Array
         from (irb):10
         from :0
irb(main):011:0>

Apparently splat will splat almost anything as long as its to_a  
method returns an array (a reasonable assumption). I don't know if I  
really like this. I always kind of thought of splat as syntax (like  
&), not really as a method (operator). Apparently its not the unary  
unarray operator, its the unary to array then unarray operator.