ruby - Setter 不适用于 -=、+= 等?

标签 ruby

<分区>

我不明白为什么会出现 nil 错误。我正确地创建了二传手。但它不接受 -=、+= 或 = 运算符后面的本身。为什么?

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 将视为 local variable assignment .但是如果你写 self.var,Ruby 会把它解析为一个方法调用,并且会尝试调用你的 setter 方法,如果你定义了的话。还要记住 self.var = 1self.var=(1)语法糖

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

最近发现了一个关于私有(private) setter 错误。这是 Bug票,现在也修好了。

关于ruby - Setter 不适用于 -=、+= 等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23940227/

相关文章:

ruby-on-rails - 学习 Ruby on Rails

ruby-on-rails - 我们可以在 rails 3.0 中使用 mailchimp 发送用户通知电子邮件吗

ruby - 使用#include 将对象与自身进行比较时不使用自定义 == 运算符?

python - 如何读取 MIDI 文件、更改其乐器并将其写回?

ruby-on-rails - 排序和限制

ruby - 在 Ruby 中从 N 和 e 创建 PEM 格式的证书

mysql - 续集永远不会返回 utf-8,只是 ascii-8bit

ruby - 按值对 Hash of Hashes 进行排序(并返回哈希,而不是数组)

ruby-on-rails - 在调用方法之前检查 nil 对象的更好方法是什么?

ruby-on-rails - Rails 部分 : What am I doing wrong?