Метод доступа определен, но не работает

У меня есть этот код:

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
Другие вопросы по тегам