【问题标题】:Is this a bug in Method#to_proc? (Ruby 1.8.7)这是 Method#to_proc 中的错误吗? (红宝石 1.8.7)
【发布时间】:2011-06-10 22:31:59
【问题描述】:

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

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

我对@9​​87654332@ 或Proc 工作原理的理解是否存在差距,或者这是一个错误?

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

【问题讨论】:

  • 通常,当有人认为他们在语言本身中发现了错误时,我会持怀疑态度,但我没有看到这种行为的其他解释,特别是考虑到它在 1.9 中按预期工作。希望有更聪明的人能启发我们,因为这让我很好奇。
  • 我并不总是在语言本身中发现错误,但当我这样做时,我正在使用 Ruby。

标签: ruby ruby-1.8 destructuring proc-object


【解决方案1】:

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

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

在 eval.c 中 Proc#call 的定义上方有一个更有用的注释,可能会进一步阐明这个问题:

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

也许我们应该将其更改为 FIXME:p

【讨论】:

  • 它已在 Ruby 1.9 中修复,所以我认为这是一个错误 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多