首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >红宝石中的Proc.arity -3.0.2 vs红宝石-2.X.X

红宝石中的Proc.arity -3.0.2 vs红宝石-2.X.X
EN

Stack Overflow用户
提问于 2021-11-24 12:30:58
回答 1查看 79关注 0票数 3

在执行完全相同的代码时,请查看下面的偏差:

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的可兼容性问题,还是一个记录在案的更改?谢谢

EN

回答 1

Stack Overflow用户

发布于 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的实际行为。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70096114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档