加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

这是方法#to_proc中的错误? (Ruby 1.8.7)

发布时间:2020-12-16 20:12:06 所属栏目:百科 来源:网络整理
导读:给出以下一个参数的方法: def foo(arg); p arg; end 我可以用一个空数组来调用它: foo([])# prints [] 我也可以将其保存为Method对象,并使用一个空数组来调用它,结果相同: method(:foo).call([])# prints [] 但是,如果将Method对象转换为Proc并使用空数组
给出以下一个参数的方法:
def foo(arg); p arg; end

我可以用一个空数组来调用它:

foo([])
# prints []

我也可以将其保存为Method对象,并使用一个空数组来调用它,结果相同:

method(:foo).call([])
# prints []

但是,如果将Method对象转换为Proc并使用空数组进行调用,则会得到一个ArgumentError:

method(:foo).to_proc.call([])
# ArgumentError: wrong number of arguments (0 for 1)
#   from (irb):4:in `foo'
#   from (irb):4:in `to_proc'
#   from (irb):10:in `call'

我预计它的行为与前两种情况相同.相反,它似乎表现得好像我写了foo(* []).但是,如果我用非空数组调用它,它的行为方式与我预期的一样:

method(:foo).to_proc.call([1])
# prints [1]

所以它破坏了参数,但只有当参数恰好是一个空数组时.只有我调用Method#to_proc.

我对于Method或Proc如何工作的理解有什么差距,还是这个bug?

我正在运行Ruby 1.8.7-p299.我在1.8.6-p399和1.8.7头观察到相同的行为.但是,我在1.9.1-p378中看不到它:当用空数组调用时,所有三种形式的print []都被打印出来.

解决方法

这几乎肯定是一个bug,

我怀疑发生这种情况的原因是Method#调用具有arity -1(Expecting a C数组的参数),Proc#调用具有arity -2(期望Ruby数组的参数).

在Proc#调用的定义以上的eval.c中还有一个有用的评论,可能会进一步说明问题:

/ * CHECKME:参数检查语义是否正确? * /

也许我们应该把它改成FIXME:p

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读