Если вы посмотрите внимательно, NoMethodError
не о том, что нет метода n
, а о методе +
для NilClass
.
В этом утверждении:
n = n + 1000
Руби должна решить, что такое n
. Поскольку вы назначаете что-то этому (n =
), это не метод. Если вы хотите вызвать метод n=
, вам нужно было указать явный получатель (self.n =
).
Так что это должна быть переменная. В данном случае локальная переменная.
Теперь, чтобы понять что-то вроде:
n = n
Руби заканчивает тем, что присваивает nil
n
. Это связано с тем, что внутренним компонентам нужно поместить заполнитель для имени переменной, которая присваивается.
Итак, когда вы делаете:
n = n + 1000
Что происходит:
- Создать новую локальную переменную
n
со значением заполнителя (nil
).
- Попытка присвоить ему все, что находится справа.
- Посчитайте, что справа -
nil + 1000
.
nil
не имеет +
метода, поэтому возникает ошибка.
Чтобы сделать то, что вы хотели, вы должны явно указать переменную экземпляра для ее значения:
n = @n + 1000
Или явно вызвать считыватель атрибутов:
n = self.n + 1000