在执行完全相同的代码时,请查看下面的偏差:
Ruby3.0.2:
3.0.2 :001 > id =:ID3.0.2 :002 > puts id.to_proc.arity.abs 2
Ruby2.7.4:
2.7.4 :001 > id = :id => :id 2.7.4 :002 > puts id.to_proc.arity.abs 1
执行证据截图:2.7.4 vs 3.0.2
我用了2.7.4。但是,任何2.X.X都返回“1”。
这是某种BWD的可兼容性问题,还是一个记录在案的更改?谢谢
发布于 2021-11-24 17:08:40
方法或proc的可变性可以是正值,也可以是负值。如果为正,则方法/proc接受静态参数数,并接受表示所需参数数的数字。
如果结果为负值(如那些proc的情况),则方法/proc接受可变数量的参数。返回的数字以-1 - n的形式给出所需参数的数量,n是所需参数的数量。
现在,对于Symbol#to_proc的结果,更正确的是-2,因为您必须传递一个参数(即表示符号的方法将被调用的接收方)加上任意数量的附加参数(这些参数将作为方法参数传递)。
在以前的Ruby版本中,返回的proc被定义为接受任意数量的参数,类似于lambda { |*args| ... }。proc的"body“然后检查参数的数量,如果参数太少就会提出。
然而,在Ruby3.0中,返回的proc与这里的lambda { |receiver, *args| ... }相似,proc的接口更清楚地表明只有一个所需的参数和任意数量的可选参数。
proc本身的行为没有发生太大变化(但请参阅下面)。在这两种情况下,内部实现都得到了很大的优化,这两个版本都会在proc实现中检查C代码中参数的数量,并自行处理参数。
然而,在Ruby3.0中,返回的Proc是lambda,因为它的实际上行为像lambda,而不是关于参数处理的proc (而且一直是这样)。这在https://bugs.ruby-lang.org/issues/16260中被改变了。
因此,行为本身并没有改变,只有在Ruby3.0中更新了已宣布的接口,以便更好地反映proc的实际行为。
https://stackoverflow.com/questions/70096114
复制相似问题