当我经常使用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
Run Code Online (Sandbox Code Playgroud)
这会输出sneaky(0)的正确值,然后输出错误sneaky = (sneaky + 1),说sneaky是nil:
0
test.rb:13:in `test': undefined method `+' for nil:NilClass (NoMethodError)
from test.rb:19:in `<main>'
Run Code Online (Sandbox Code Playgroud)
那是怎么回事?@sneaky在构造函数中被设置为0.如果它真的是零,那不应该puts打印一个空行而不是一个0?
编辑:是的,替换sneaky = (sneaky + 1)为self.sneaky = sneaky + 1解决问题,即使self.sneaky=看起来像隐私侵犯,因为它有一个明确的接收器.显然,对于setter来说是一个例外.但与隐私的奇怪互动意味着你不能说 …