应为ArgumentError,但得到NoMethodError



当我调用下面类中的各个方法时,我期望ArgumentError,但我看到:

class A
  def with_one_argument(&block)
    block.call
  end
end
A.new.with_one_argument
# => NoMethodError: undefined method `call' for nil:NilClass

但这正如预期的那样:

class B
  def with_one_argument(some_value)
    puts some_value
  end
end
B.new.with_one_argument
# => ArgumentError: wrong number of arguments (0 for 1)

有人能解释为什么(&block)被视为特殊的吗?在我的理解中,如果我没有为参数提供默认值,那么ArgumentError是期望的。

没有什么复杂的。事实很简单,一个块不是一个论点。对于A,如果您传递一个块,它将被称为block作为转换的proc,否则block的值为nil。但在任何一种情况下,block都是将传递的块(既不是参数也不是对象)转换为proc(即对象)的结果。

相关内容

最新更新