--Apple-Mail-9--380644935
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
charset=US-ASCII;
delsp=yes;
format=flowed
There's something about it near the beginning, in the section about
passing arguments to functions. In fact, until the post below, I had
no idea it could be used more generally!
The * is a "unary unarray" operator. It "un-arrays" the array into a
list of separate values.
Thus, for example:
a = [4,5,6]
[1,2,3,*a] => [1,2,3,4,5,6]
There are rules about where and when and how it can be used, but
that's basically what's happening when you see that.
That makes a lot of sense, thank you! Usually this will be used to
allow a function to take additional arguments:
def a_function( required_argument, also_required,
*any_optional_arguments )
puts required_argument
puts also_required
puts any_optional_arguments.join(',')
end
Calling:
irb(main):006:0> a_function(1,2,3,4,5)
1
2
3,4,5
You can also use it to split out an array in to seperate parameters
(so kind of the opposite of the above). Again, this is often used
when calling a method:
irb(main):007:0> a=[1,2,3,4,5]
=> [1, 2, 3, 4, 5]
irb(main):008:0> a_function(*a)
1
2
3,4,5
=> nil
irb(main):009:0> a_function(a)
ArgumentError: wrong number of arguments (1 for 2)
from (irb):9:in `f'
from (irb):9
As an example of both of these uses; I'd like to have an object
delegate any method calls that it can't handle to some other object.
I could write it like this:
class DelgatingClass
attr_accessor :my_delegatee
...
# Pick method calls I can't handle, and pass them on to the delegatee.
def method_missing( method_name, *all_the_parameters )
@my_delegatee.send( method_name, *all_the_parameters )
end
...
end
However, the above doesn't pick up any optional block that's
passed to the method. To rectify that, you would probably write the
method above like this:
def method_missing( method_name, *all_the_parameters, &optional_block )
@my_delegatee.send( method_name, *all_the_parameters, &optional_block )
end
I think this is also discussed in the same section of the pickaxe.
--Apple-Mail-9--380644935--