gpt4 book ai didi

ruby - Pro.arity 与 Lambda.arity

转载 作者:数据小太阳 更新时间:2023-10-29 06:38:00 27 4
gpt4 key购买 nike

为什么 proc 和 lambda 返回不同的元数值?

例如

proc   { |x = 0| }.arity       #=> 0
lambda { |a = 0| }.arity #=> -1
proc { |x=0, y| }.arity #=> 1
lambda { |x=0, y| }.arity #=> -2

参见:http://www.ruby-doc.org/core-2.0/Proc.html#method-i-arity

最佳答案

根据您链接到的文档:

Returns the number of arguments that would not be ignored. If the block is declared to take no arguments, returns 0. If the block is known to take exactly n arguments, returns n. If the block has optional arguments, return -n-1, where n is the number of mandatory arguments. A proc with no argument declarations is the same a block declaring || as its arguments.

文档忘记提及的是 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 Programming Language 有更多细节:

6.5.3 The Arity of a Proc

The arity of a proc or lambda is the number of arguments it expects. (The word is derived from the “ary” suffix of unary, binary, ternary, etc.) Proc objects have an arity method that returns the number of arguments they expect. For example:

lambda{||}.arity # => 0. No arguments expected
lambda{|x| x}.arity # => 1. One argument expected
lambda{|x,y| x+y}.arity # => 2. Two arguments expected

The notion of arity gets confusing when a Proc accepts an arbitrary number of argu- ments in an *-prefixed final argument. When a Proc allows optional arguments, the arity method returns a negative number of the form -n-1. A return value of this form indicates that the Proc requires n arguments, but it may optionally take additional arguments as well. -n-1 is known as the one’s-complement of n, and you can invert it with the ~ operator. So if arity returns a negative number m, then ~m (or -m-1) gives you the number of required arguments:

lambda {|*args|}.arity # => -1. ~-1 = -(-1)-1 = 0 arguments required
lambda {|first, *rest|}.arity # => -2. ~-2 = -(-2)-1 = 1 argument required

There is one final wrinkle to the arity method. In Ruby 1.8, a Proc declared without any argument clause at all (that is, without any || characters) may be invoked with any number of arguments (and these arguments are ignored). The arity method returns –1 to indicate that there are no required arguments. This has changed in Ruby 1.9: a Proc declared like this has an arity of 0. If it is a lambda, then it is an error to invoke it with any arguments:

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

For procs created using lambda or ->() an error is generated if the wrong number of parameters are passed to a Proc with multiple parameters. For procs created using Proc.new or Kernel.proc, extra parameters are silently discarded.

关于ruby - Pro.arity 与 Lambda.arity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16986471/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com