初始化时出现参数错误

时间:2014-08-21 04:08:17

标签: ruby initialization

我正在尝试以下代码:

class A
  def initialize foo = nil
    super
  end
end

A.new

运行时,会在wrong number of arguments (1 for 0)行引发错误super。为什么这会引发错误?我没有通过任何论据newsuper,我不知道为什么。如果我省略了可选参数签名foo = nil,则错误就会消失。

上面的代码super可能没有多大意义,但在实际使用中,AHash的子类,我有一个块传递给super

1 个答案:

答案 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]]