Setter无法使用 – =,+ =等?

我不明白为什么我得到一个零错误。 我正确地创建了setter。 但它不接受 – =,+ =,或者它自身在=运算符后面。 为什么?

class Test def var; @var || 0; end def var=(value) @var = value end def initialize @var = 2.4 # Sample value end def test puts var var -= 1 # <<< crash: undefined method for nil class puts var var = var - 1 # <<< crash: undefined method for nil class puts var end end a = Test.new a.test 

写为

 def test puts var self.var -= 1 puts var self.var = var - 1 puts var end 

如果你不使用self ,那么Ruby会将这些var视为局部变量,而不是setter方法调用。

请记住,在Ruby 方法中,永远不能在没有接收器(隐式/显式)的情况下进行调用 。 现在,如果你写var = 1 ,Ruby将被视为局部变量赋值 。 但是如果你编写self.var ,Ruby会将它解析为方法调用,如果你定义的话,会尝试调用你的setter方法。 还记得self.var = 1self.var=(1)句法糖

有关同样的更有趣的讨论,值得一读私人定制者可以被自己称呼,为什么不吸气?

最近发现一个关于私人制定者的 错误 。 这是Bug票证,它现在也已修复。

因为var是零。 你需要先为它分配一些值

 def test puts var var=0 var -= 1 # <<< crash: undefined method for nil class puts var var=0 var = var - 1 # <<< crash: undefined method for nil class puts var end 

更新:目前尚不清楚是否需要实例变量或’var’的类变量。 以下示例适用于实例变量。

如果你想在类外部执行此操作,我会使用attr_reader或attr_accessor。

 class Test attr_reader :var def initialize @var=2.4 end def test puts @var @var -= 1 puts @var @var = @var - 1 puts @var end end t=Test.new t.test puts t.var $ /tmp/t.rb 2.4 1.4 0.3999999999999999 0.3999999999999999