为什么ruby代码会生成ArgumentError?

时间:2016-03-04 07:44:49

标签: ruby arguments

您好我正在研究Ruby Koans。我想知道为什么如果在下面的代码中返回ArgumentError,会引发Dog6.new

class Dog6
  attr_reader :name 
  def initialize(initial_name)
    @name = initial_name 
  end
end

def test_initialize_provides_initial_values_for_instance_variables
  fido = Dog6.new("Fido")
  assert_equal "Fido", fido.name
end

def test_args_to_new_must_match_initialize
  assert_raise(ArgumentError) do
    Dog6.new
  end
end

是因为Dog6.new没有任何参数吗?谢谢!!

3 个答案:

答案 0 :(得分:2)

是的,你的假设是正确的。

Dog6.new隐式调用Dog6#initialize初始化新创建的实例(可能会考虑MyClass#initialize关于此类的构造函数,)显然有一个需要论点。由于没有对Dog6.new的调用进行任何论证,因此ArgumentError正在被提升。

答案 1 :(得分:1)

如果你想要一个没有参数的构造函数(毕竟 - 有些狗没有名字......),你可以添加一个默认的name参数。

def initialize(name = nil)
  @name = name
end

答案 2 :(得分:0)

Dog6类的初始值设定项中,initial_name被定义为对象构造所需的参数。如果要在没有此参数的情况下实例化此类,则会引发ArgumentError,因为类定义具有方法签名,使得Dog6.new无效,就像您猜测的那样。在这种情况下,您将看到的错误是:

ArgumentError: wrong number of arguments (0 for 1)

阅读有关ArgumentError异常here的更多信息。