Hi --

Mischa Fierer wrote:
> Hi --
>
> After a good amount of digging, I'm still not sure how [*[1,2]] ==
> [1,2]. I understand what it does, but I want to know why.
>
> I had originally assumed it was a normal method (like + or -), but it
> appears to be implemented at a deeper level. It looks like rubinius does
> something with cast_array. Ruby 1.8 does to_ary and ruby 1.9 does
> to_splat. Where does this happen? to_ary says that it just returns self,
> so how does self get exploded?
>
> Short of reading eval.c, does anyone have any pointers?

It ties itself to to_a:

 >> obj = Object.new
=> #<Object:0xa43db54>
 >> def obj.to_a; [1,2,3]; end
=> nil
 >> a = *obj
=> [1, 2, 3]

That code works the same in 1.8 and 1.9.1. There may be some classes 
where it's optimized away so that you can't override it even by defining 
to_a. I'm not sure.


David

-- 
David A. Black / Ruby Power and Light, LLC
Ruby/Rails consulting & training: http://www.rubypal.com
Coming in 2009: The Well-Grounded Rubyist (http://manning.com/black2)

Ruby Training Atlanta! April 1-3, http://www.entp.com/training/atlanta09