Метод доступа определен, но не работает
У меня есть этот код:
class A
attr_accessor :count
def initialize
@count = 0
end
def increase_count
count += 1
end
end
A.new.increase_count
Жалуется:
in `increase_count': undefined method `+' for nil:NilClass (NoMethodError)
Если я изменю increase_count
определение к:
class A
def increase_count
@count += 1
end
end
тогда не жалуется. Может быть, я что-то упустил, или это просто странное поведение Руби.
1 ответ
Решение
A#count=
требует явного получателя, так как все foo=
методы. В противном случае локальная переменная count
создается и поднимается, делая count + 1
используя локальную еще не инициализированную переменную.
class A
attr_accessor :count
def initialize
@count = 0
end
def increase_count
# ⇓⇓⇓⇓⇓ THIS
self.count += 1
end
end
puts A.new.increase_count
#⇒ 1
Примечание:
attr_accessor :count
не что иное, как синтаксический сахар для:
def count
@count
end
def count=(value)
@count = value
end