On Thu, Jan 24, 2013 at 3:12 AM, Patricia J. <[email protected]> wrote:
> Can someone pls explain why in the following example that *c is left
> empty? After the required arguments have been filled, doesn't it make
> more sense that since b=1 has already been assigned a value to give the
> remaining value/argument (2) to *c?
>
> Can you pls confirm that arguments with default values are always paired
> before sponge arguments (*c)?
>
> . . . .
>
> def args_unleashed(a, b=1, *c, d, e)
> puts "Arguments: "
> p a, b, c, d, e
> end
>
> args_unleashed(1, 2, 3, 4)
>
> => [1, 2, [], 3, 4]
There is pattern matching going on. (This was introduced in Ruby
1.9.* btw.) The arguments passed are matched against the argument
list definition and distribute to formal arguments to create a match.
There are even more involved patterns possible:
$ ruby args.rb
ERROR FUN1: args=[1] error=#<ArgumentError: wrong number of arguments (1 for 4)>
ERROR FUN2: args=[1] error=#<ArgumentError: wrong number of arguments (1 for 4)>
ERROR FUN1: args=[1, 2] error=#<ArgumentError: wrong number of
arguments (2 for 4)>
ERROR FUN2: args=[1, 2] error=#<ArgumentError: wrong number of
arguments (2 for 4)>
ERROR FUN1: args=[1, 2, 3] error=#<ArgumentError: wrong number of
arguments (3 for 4)>
ERROR FUN2: args=[1, 2, 3] error=#<ArgumentError: wrong number of
arguments (3 for 4)>
FUN1 args=[1, 2, 3, 4] -> fun1 {:a=>1, :b=>2, :c=>3, :d=>nil, :e=>4}
FUN2 args=[1, 2, 3, 4] -> fun2 {:a=>1, :b=>2, :c=>3, :d=>nil, :e=>4}
ERROR FUN1: args=[1, 2, 3, 4, 5] error=#<ArgumentError: wrong number
of arguments (5 for 4)>
ERROR FUN2: args=[1, 2, 3, 4, 5] error=#<ArgumentError: wrong number
of arguments (5 for 4)>
ERROR FUN1: args=[1, 2, 3, 4, 5, 6] error=#<ArgumentError: wrong
number of arguments (6 for 4)>
ERROR FUN2: args=[1, 2, 3, 4, 5, 6] error=#<ArgumentError: wrong
number of arguments (6 for 4)>
FUN1 args=[1, 2, [3, 4], 5] -> fun1 {:a=>1, :b=>2, :c=>3, :d=>4, :e=>5}
FUN2 args=[1, 2, [3, 4], 5] -> fun2 {:a=>1, :b=>2, :c=>3, :d=>4, :e=>5}
FUN1 args=[1, 2, [3, 4, 5], 6] -> fun1 {:a=>1, :b=>2, :c=>3, :d=>4, :e=>6}
FUN2 args=[1, 2, [3, 4, 5], 6] -> fun2 {:a=>1, :b=>2, :c=>3, :d=>4, :e=>6}
$ cat args.rb
def fun1(a,b,(c,d),e)
{a: a, b: b, c: c, d: d, e: e}
end
fun2 = lambda do |a,b,(c,d),e|
{a: a, b: b, c: c, d: d, e: e}
end
[
[1],
[1, 2],
[1, 2, 3],
[1, 2, 3, 4],
[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5, 6],
[1, 2, [3, 4], 5],
[1, 2, [3, 4, 5], 6],
].each do |args|
begin
printf "FUN1 args=%p -> fun1 %p\n", args, fun1(*args)
rescue Exception => e
printf "ERROR FUN1: args=%p error=%p\n", args, e
end
begin
printf "FUN2 args=%p -> fun2 %p\n", args, fun2[*args]
rescue Exception => e
printf "ERROR FUN2: args=%p error=%p\n", args, e
end
end
Kind regards
robert
--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/
--
[email protected] |
https://groups.google.com/d/forum/ruby-talk-google?hl=en