预期的 ArgumentError 但得到 NoMethodError

Expected ArgumentError but got 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 作为转换过程,否则 block 的值为 nil。但无论哪种情况,block 都是将传递的块(既不是参数也不是对象)转换为 proc(对象)的结果。