On Wed, Nov 12, 2008 at 11:13:18PM +0900, Thomas Enebo wrote:
>>   class Foo
>>     define_method(:foo) { |a,(b,c)| p a,b,c }
>>   end
>>
>>   Foo.new.foo(1,[2,3])
>>   puts "Arity: #{Foo.new.method(:foo).arity}"
>>
>> So foo has an arity of 2. But if you pass anything other than a two-element
>> array for the second argument, you get an ArgumentError: wrong number of
>> arguments.
>>
>> This suggests to me that the arguments structure needs to be nestable; the
>> second argument is itself an argument list.
>>
>>   
> I question the validity of Arity for this case since the arity is really 3.

I don't think so:

class Foo
  define_method(:foo) { |a,(b,c)| p a,b,c }
end

Foo.new.foo(1,2,3) rescue(puts "pants")      # => pants
Foo.new.foo(1,[2]) rescue(puts "pants")      # => pants
Foo.new.foo(1,[2,3,4]) rescue(puts "pants")  # => pants

You must pass exactly two arguments to #foo, which by my understanding of
arity means the arity is 2. But the second argument must be an Array with
exactly two elements.

Regards,

Brian.