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 = 1
是self.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