2016-03-04 5 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

Просто добавьте, что если вы хотите иметь конструктор без аргументов (в конце концов - некоторые собаки не имеют имени ...), вы можете иметь значение по умолчанию для параметра name.

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

Спасибо за дополнительную информацию! – Penny

+0

Добавление значения по умолчанию будет ** прерывать тест **. Это никоим образом не применимое решение. – mudasobwa

+0

Действительно! Сначала вам придется сначала изменить тесты. :-) – froderik

Смежные вопросы