2016-03-04 52 views
0

嗨,我正在研究Ruby Koans。我想知道爲什麼ArgumentError會在下面的代碼中返回Dog6.new爲什麼Ruby代碼會生成一個ArgumentError?

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沒有任何參數?謝謝!!

回答

2

是的,你的假設是正確的。

Dog6.new隱式調用Dog6#initialize初始化新創建的實例(有人可能會想到MyClass#initialize爲約構造這個類,),這顯然有一個需要說法。由於對Dog6.new的呼叫沒有提供任何參數,因此ArgumentError正在提出。

+0

謝謝你的解釋!現在我明白了:) – Penny

0

Dog6類的初始化器中,initial_name被定義爲對象構造所需的參數。如果這個類沒有這個參數被實例化,將會產生一個ArgumentError,因爲類定義有一個方法簽名,使得Dog6.new無效,就像你猜測的那樣。在這種情況下,你會看到錯誤是:

ArgumentError: wrong number of arguments (0 for 1) 

瞭解更多關於ArgumentError異常here

+0

非常感謝! – Penny

1

只要添加如果你想有一個沒有參數的構造函數(畢竟 - 有些狗沒有名字....),你可以有一個名稱參數的默認值。

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

感謝您的額外信息! – Penny

+0

添加默認值**將打破測試**。這絕不意味着適用的解決方案。 – mudasobwa

+0

確實!你必須首先明確地改變測試。 :-) – froderik

相關問題