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

时间:2014-05-29 18:19:29

标签: ruby

我不明白为什么我会收到零错误。我正确地创建了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

3 个答案:

答案 0 :(得分:5)

写为

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

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

请记住,在Ruby 中,方法调用永远不能没有接收者(隐式/显式)。现在,如果您编写var = 1,Ruby将视为local variable assignment。但是如果你写self.var,Ruby会将它解析为方法调用,如果你定义的话,会尝试调用你的setter方法。另请注意self.var = 1self.var=(1)语法糖

有关同样的更有趣的讨论,值得一读Private setters can be called by self, why not getters?

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

答案 1 :(得分:0)

因为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

答案 2 :(得分:-1)

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

如果你想在课堂外做这个,我会使用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