当我经常使用Ruby时,我养成了将所有内容都公开并忽视隐私的坏习惯。不幸的是,这种无知又回来困扰着我。这是我的问题的简单版本:
class Something
private
attr_accessor :sneaky
public
def initialize
@sneaky = 0
end
def test
while sneaky < 10
puts "#{sneaky}"
sneaky = (sneaky + 1)
end
end
end
test = Something.new
test.test
这会打印出偷偷摸摸的{({1}})的正确值,然后在0
出现错误,说明sneaky = (sneaky + 1)
为sneaky
:
nil
该怎么办? 0
test.rb:13:in `test': undefined method `+' for nil:NilClass (NoMethodError)
from test.rb:19:in `<main>'
已在构造函数中设置为0。如果它真的是零,那么@sneaky
不应该打印一个空行而不是puts
吗?
编辑:是的,将0
替换为sneaky = (sneaky + 1)
可以解决问题,即使self.sneaky = sneaky + 1
看起来像是隐私侵犯,因为它有明确的接收者。显然,对于setter来说是一个例外。但与隐私的奇怪互动意味着您无法说self.sneaky=
(最终获得self.sneaky += 1
)。幸运的是我not the only one who thinks that's weird。
答案 0 :(得分:5)
foo = bar
的形式分配给名为foo
的局部变量。如果您想拨打attr_writer
,则需要使用明确的接收方:self.sneaky += 1
。
这与private
无关,它只是局部变量赋值的基本Ruby语法。