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