gpt4 book ai didi

ruby - 这是 Method#to_proc 中的错误吗? ( ruby 1.8.7)

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

给定以下采用一个参数的方法:

def foo(arg); p arg; end

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

foo([])
# prints []

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

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

但是,如果我将 Method 对象转换为 Proc 并使用空数组调用 that,我会得到一个 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 时。

我对 MethodProc 的工作方式的理解是否存在差距,或者这是一个错误?

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

最佳答案

这几乎可以肯定是一个错误,

我怀疑发生这种情况的原因是 Method#call 的元数为 -1(期望参数为 C 数组),而 Proc#call 的元数为 -2(期望为 Ruby 参数数组)。

在 eval.c 中 Proc#call 的定义上方有一个进一步有用的评论,可以进一步阐明这个问题:

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

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

关于ruby - 这是 Method#to_proc 中的错误吗? ( ruby 1.8.7),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4721708/

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