3
与proc
和method
,我得到以下不同的结果。这是为什么?为什么我会在proc和method之间得到不同的结果?
proc {|x|}.arity # => 1
proc {|x=1|}.arity # => 0
def foo(x=1);end;method(:foo).arity # => -1
与proc
和method
,我得到以下不同的结果。这是为什么?为什么我会在proc和method之间得到不同的结果?
proc {|x|}.arity # => 1
proc {|x=1|}.arity # => 0
def foo(x=1);end;method(:foo).arity # => -1
注意的事实是,在红宝石,Method
和Proc
是两回事。
对于Proc#arity
,返回的数字是通过调用proc不会被忽略的参数数量。
对于您声明的第一个proc,它只需要一个参数,因此它的参数为1. 对于第二个proc,它只有一个参数是可选的,因此它根本不期待参数,所以它是0
。
对于Method#arity
,返回的数字是该方法接受的参数个数。
你的方法实际上需要一个可变数量的参数,即0..1,因此arity预计会返回一个负数,这里是-1
,因为有0个必需的参数,并且公式为-n-1(n是所需参数的数量)。
请注意,Proc#arity
的文档具有误导性,因为它提到了与Method#arity
相同的公式,但事实并非如此。
lambda表达式的情况下,也很有趣,因为:
lambda {|x=1|}.arity # => -1
它就像一个Method
。
实际上'lambda's是'proc's。所以...... –
@JanDvorak令人困惑的是'proc'和'Proc'意味着不同的东西。 – sawa
@sawa抱歉;我的意思是“实际上'lambda's是'Proc's。所以...” –