Ruby private attr_accessor和意外的nil

时间:2014-12-03 02:24:57

标签: ruby

当我经常使用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

1 个答案:

答案 0 :(得分:5)

foo = bar的形式分配给名为foo的局部变量。如果您想拨打attr_writer,则需要使用明确的接收方:self.sneaky += 1

这与private无关,它只是局部变量赋值的基本Ruby语法。