您好我正在研究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
没有任何参数吗?谢谢!!
答案 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的更多信息。