I experienced this same confusion.
What I figured out (which I think is correct) is that the documentation
you quoted from “Programming Ruby” is correct for Ruby 1.6
The simpler results (0 for no-args, n for n args, -n for variable length,
minimum of n args) are for Ruby 1.8.
Here’s two tests on different ruby versions. Note that the only
difference is methods that take 1 argument:
lewisd@wedge:~/projects/rcoaster$ ruby -v
ruby 1.6.8 (2002-12-24) [i386-linux]
lewisd@wedge:~/projects/rcoaster$ ruby ./test/testArity.rb
= 0
a> = -1
a,b| = 2
a,b,c| = 3
*a| = -1
a,*b| = -2
a,b,*c| = -3
lewisd@wedge:~/projects/rcoaster$
lewisd@derlewi:~/projects/rcoaster$ ruby -v
ruby 1.8.1 (2003-11-11) [i386-linux]
lewisd@derlewi:~/projects/rcoaster$ ruby ./test/testArity.rb
= 0
a> = 1
a,b| = 2
a,b,c| = 3
*a| = -1
a,*b| = -2
a,b,*c| = -3
lewisd@derlewi:~/projects/rcoaster$
lewisd@wedge:~/projects/rcoaster$ cat ./test/testArity.rb
puts "|| = " + Proc.new {||}.arity.to_s
puts "|a| = " + Proc.new {|a|}.arity.to_s
puts "|a,b| = " + Proc.new {|a,b|}.arity.to_s
puts "|a,b,c| = " + Proc.new {|a,b,c|}.arity.to_s
puts "|*a| = " + Proc.new {|*a|}.arity.to_s
puts "|a,*b| = " + Proc.new {|a,*b|}.arity.to_s
puts "|a,b,*c| = " + Proc.new {|a,b,*c|}.arity.to_s
lewisd@wedge:~/projects/rcoaster$
···
On Mon, 15 Dec 2003, Jon A. Lambert wrote:
From the Programming Ruby - The Pragmatic Programmer’s Guide:
–class Proc —
arity prc.arity → anInteger
Returns the number of arguments required by the block. If the block
takes no arguments, returns -1. If it takes one argument, returns -2.
Otherwise, returns a positive argument count unless the last argument
is prefixed with *, in which case the argument count is negated. The
number of required arguments is anInteger for positive values, and
( anInteger +1).abs otherwise.
Proc.new {||}.arity » 0
Proc.new {|a|}.arity » -1
Proc.new {|a,b|}.arity » 2
Proc.new {|a,b,c|}.arity » 3
Proc.new {|*a|}.arity » -1
Proc.new {|a,*b|}.arity » -2
–class Method –
arity meth.arity → aFixnum
Returns an indication of the number of arguments accepted by a method.
Returns a nonnegative integer for methods that take a fixed number of
arguments. For Ruby methods that take a variable number of arguments,
returns -n-1, where n is the number of required arguments. For methods
written in C, returns -1 if the call takes a variable number of arguments.
I can make neither head nor tail of this as the values that are actually returned
are not those in the example, and the text doesn’t appear to make any sense at
all to me. Can someone explain what arity means and how it’s determined?
–
J. Lambert
Derek Lewis
===================================================================
Java Web-Application Developer
Email : email@lewisd.com
Cellular : 604.312.2846
Website : http://www.lewisd.com
“If you’ve got a 5000-line JSP page that has “all in one” support
for three input forms and four follow-up screens, all controlled
by “if” statements in scriptlets, well … please don’t show it
to me :-). Its almost dinner time, and I don’t want to lose my
appetite :-).”
- Craig R. McClanahan