3

使用procmethod,我得到以下不同的结果。这是为什么?

proc {|x|}.arity                    # => 1 
proc {|x=1|}.arity                  # => 0 
def foo(x=1);end;method(:foo).arity # => -1 
4

1 回答 1

4

请注意,在 ruby​​ 中,MethodProc是两个不同的东西。

对于Proc#arity,返回的数字是调用 proc 时不会忽略的参数的数量。
对于您声明的第一个 proc,它只需要一个参数,因此它的元数为 1。对于您的第二个 proc,它只有一个参数是可选的,因此它根本不需要参数,所以它是0.

对于Method#arity,返回的数字是方法接受的参数数量。
您的方法实际上需要可变数量的参数,即 0..1,因此 arity 应该返回一个负数,这里-1,因为有 0 个必需参数,公式是 -n-1(n 是必需的数量论据)。

请注意, 的文档Proc#arity具有误导性,因为它提到了与 for 相同的公式Method#arity,但事实并非如此。

lambdas 的情况也很有趣,因为:

lambda {|x=1|}.arity     # => -1

它的行为类似于Method.

于 2013-06-13T08:33:23.907 回答