我正在尝试以下代码:
class A
def initialize foo = nil
super
end
end
A.new
运行时,会在wrong number of arguments (1 for 0)
行引发错误super
。为什么这会引发错误?我没有通过任何论据new
或super
,我不知道为什么。如果我省略了可选参数签名foo = nil
,则错误就会消失。
上面的代码super
可能没有多大意义,但在实际使用中,A
是Hash
的子类,我有一个块传递给super
答案 0 :(得分:0)
它会引发因为当你在没有指定参数的情况下调用super时,它会使用调用者收到的相同参数调用parent方法。
在您的情况下,仅调用super
与调用super(foo)
相同,Object
类(A
的父对象)不包含接收参数的初始化程序。
我相信你期望这段代码的行为:
class A
def initialize foo = nil
super() # <= note the empty parentesis
end
end
A.new
值得注意的是,即使默认值为nil,具有默认值的参数仍然是参数。默认值仅表示调用者可以在不指定参数的情况下调用它,而不是参数不存在。对于Ruby VM,初始化程序将始终具有foo
参数。
您可以验证在irb会话中编写以下代码的此行为:
def foo(bar = nil); end
method(:foo).parameters # => [[:opt, :bar]]