3

我有这个代码:

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

然后它不会抱怨。可能是我遗漏了一些东西,或者这只是 Ruby 的一种奇怪行为。

4

1 回答 1

11

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
于 2018-12-14T11:02:03.520 回答