预期的 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(对象)的结果。
当我调用下面 类 中的各个方法时,我期望 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(对象)的结果。