根据您链接到的文档:
返回不会被忽略的参数数量。如果该块被声明为不带参数,则返回 0。如果已知该块恰好带 n 个参数,则返回 n。如果块具有可选参数,则返回 -n-1,其中 n 是强制参数的数量。没有参数声明的过程与声明 || 的块相同作为其论据。
文档忘记提及的是 procs 和 lambda 对待参数的方式并不完全相同,例如:
>> p = proc { |a = 1, b| b }
=> #<Proc:0x007ff0091ef810@(irb):1>
>> l = lambda { |a = 1, b| b }
=> #<Proc:0x007ff0098099f8@(irb):2 (lambda)>
>> p.call
=> nil
>> l.call
ArgumentError: wrong number of arguments (0 for 1..2)
from (irb):2:in `block in irb_binding'
from (irb):4:in `call'
from (irb):4
from /usr/local/bin/irb:12:in `<main>'
编辑:O'Reilly 的 Ruby 编程语言具有更多细节:
6.5.3 过程的数量
proc 或 lambda 的数量是它期望的参数数量。
(这个词源自一元、二元、三元的“ary”后缀,
等)Proc 对象有一个 arity 方法,返回数量
他们所期望的论点。例如:
lambda{||}.arity # => 0. No arguments expected
lambda{|x| x}.arity # => 1. One argument expected
lambda{|x,y| x+y}.arity # => 2. Two arguments expected
当 Proc 接受任意值时,数量的概念会变得混乱
带 * 前缀的最终参数中的参数数量。当一个过程
允许可选参数,arity 方法返回负数
形式为-n-1。这种形式的返回值表明Proc
需要 n 个参数,但可以选择使用其他参数
以及。 -n-1 被称为 n 的补码,你可以
使用 ~ 运算符反转它。所以如果 arity 返回负数
m,然后 ~m(或 -m-1)给出所需参数的数量:
lambda {|*args|}.arity # => -1. ~-1 = -(-1)-1 = 0 arguments required
lambda {|first, *rest|}.arity # => -2. ~-2 = -(-2)-1 = 1 argument required
arity 方法还有最后一个问题。在 Ruby 1.8 中,一个 Proc
完全不带任何参数子句声明(即不带任何 ||
字符)可以用任意数量的参数调用(并且这些
参数被忽略)。 arity 方法返回 –1 表示
没有必需的参数。这在 Ruby 1.9 中发生了变化:Proc
像这样声明的元数为 0。如果它是 lambda,那么它就是一个
使用任何参数调用它都会出错:
puts lambda {}.arity # –1 in Ruby 1.8; 0 in Ruby 1.9
编辑 2:Stefan 在评论中添加了他们不同的确切原因:
http://www.ruby-doc.org/core-2.0/Proc.html#method-i-call http://www.ruby-doc.org/core-2.0/Proc.html#method-i-call
For procs
创建使用lambda
or ->()
如果将错误数量的参数传递给 a,则会生成错误Proc
有多个参数。为了procs
创建使用Proc.new
or Kernel.proc
,额外的参数会被默默地丢弃。