存取方法已定义但不起作用

Ahm*_*mza 3 ruby attr-accessor

我有这个代码:

class A
  attr_accessor :count

  def initialize
    @count = 0
  end

  def increase_count
    count += 1
  end
end

A.new.increase_count
Run Code Online (Sandbox Code Playgroud)

它抱怨说:

in `increase_count': undefined method `+' for nil:NilClass (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

如果我将increase_count定义更改为:

class A
  def increase_count
    @count += 1
  end
end
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*kin 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
Run Code Online (Sandbox Code Playgroud)

边注:

attr_accessor :count 只不过是一个语法糖:

def count
  @count
end

def count=(value)
  @count = value
end
Run Code Online (Sandbox Code Playgroud)

  • 我想最好在`initialize`中使用setter以达到通用性 (2认同)
  • @Ahmadhamza:如果你在做`count = 1`,你会打电话给二传手吗?或者你创建一个局部变量?如何区分这两者?这就是为什么你必须做`self.count = 1`来引用setter (2认同)
  • `documents <<`调用`documents.class#<<`方法.接收器在`#var =`方法中_only_是必需的.`attr_accessor:foo`是`def foo =(val)的语法糖; @foo = val; end`. (2认同)