【问题标题】:Why do I get different results for arity between proc and method?为什么proc和method之间的arity会得到不同的结果?
【发布时间】:2013-06-13 08:12:18
【问题描述】:

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

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

【问题讨论】:

    标签: ruby arity


    【解决方案1】:

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

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

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

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

    lambdas 的例子也很有趣,因为:

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

    它的行为类似于Method

    【讨论】:

    • @JanDvorak 令人困惑的是procProc 的含义不同。
    • @sawa 抱歉;我的意思是“实际上lambdas 是Procs。所以......”
    • 重点是proc 创建的Proc 实例和lambda 创建的Proc 实例的行为不同。由method 创建的Method 实例的行为与后者相似。
    • Lambda 在参数检查和return 的行为中都表现得像方法。常规非 lambda Procs 在参数检查和 return 的行为中都表现得像块。请记住:“block”与“proc”押韵,“lambda”是希腊字母,就像“method”是希腊词一样。 (是的,很弱,我知道 :-D)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 2021-03-20
    相关资源
    最近更新 更多