为什么我在proc和方法之间得到不同的结果?

时间:2013-06-13 08:12:18

标签: ruby arity

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

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

1 个答案:

答案 0 :(得分:4)

请注意,在红宝石中,MethodProc是两回事。

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

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

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

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

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

它的行为类似于Method