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