Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 已定义访问器方法,但不起作用_Ruby_Attr Accessor - Fatal编程技术网

Ruby 已定义访问器方法,但不起作用

Ruby 已定义访问器方法,但不起作用,ruby,attr-accessor,Ruby,Attr Accessor,我有以下代码: 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) 如果我将增加\u计数定义更改为: cla

我有以下代码:

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)
如果我将
增加\u计数
定义更改为:

class A
  def increase_count
    @count += 1
  end
end
那么它就不会抱怨了。可能是我遗漏了什么,或者这只是Ruby的一种奇怪行为。

a#count=与所有
foo=
方法一样需要一个显式接收器。否则,将创建并提升局部变量
count
,使用尚未初始化的局部变量使
count+1

旁注:

attr\u accessor:count
只不过是一种语法糖:

def count
  @count
end

def count=(value)
  @count = value
end

我想在
initialize
中使用setter也更好,因为commonality@Ahmadhamza你从不调用
A#payload=
@Ahmadhamza:如果你在做
count=1
,你会调用setter吗?还是创建局部变量?如何区分这两者?这就是为什么您必须执行
self.count=1
来引用setter@Ahmadhamza,它确实会发生,如果指定给它
documents+=[…]
documents为什么要通过访问器方法访问类中的实例变量?定义和使用访问器方法的目的是从实例上下文之外访问它。您正在破坏这个目的。@sawa:访问器的目的是为了方便对变量的访问。内部使用非常好。甚至推荐。@sawa啊,确实是这样。老实说,有一种方法:
Object#send
:)@Ahmadhamza实际上没有办法将其作为私有方法调用(使用),因为它需要一个与其私有状态相矛盾的显式接收器(不能用显式接收器调用私有方法)。@AlekseiMatiushkin(回复您提到
Object#send
)有一种方法可以调用它(比如您展示的方法,它也适用于所有其他私有方法),当然。我写道,没有方法将其作为私有方法调用。
def count
  @count
end

def count=(value)
  @count = value
end