在 Ruby 中将实例变量设置为只读



有没有办法保护实例变量不被写入/修改在 Ruby 中?

假设我这样做:

class Test
  def initialize(var)
   @var = var
  end
  def modify
   @var = "test" # This would raise an error, saying '@var' is just readable.
  end
end

有没有办法使实例变量为只读?如果不是,我在寻找哪种属性?

您可以通过冻结包装对象来虚拟保护实例变量:

t=Test.new "example"
p t.var
# "example"
t.freeze
t.modify
# :in `modify': can't modify frozen Test (RuntimeError)
p t.var
# t.var is still equal to "example" if exception won't terminate app

有关详细信息,请参阅Object#freeze方法。

没有办法做到这一点。首先,不应该有理由要求类需要对属性进行写保护。其次,Ruby 中的所有访问保护规则,例如它的存在,实际上只是建议 - 最终,使用内省,您可以访问任何您想要的内容,包括重新定义核心方法,如 Fixnum#+ .试试这个:

class Fixnum
  def +(other)
    self - other
  end
end

它会比写@var更会弄乱你的代码。

不,没有办法做到这一点。Ruby 最接近不可写变量的是常量,它可以存在于类或模块中,并以大写字母(通常都是大写字母)开头。Ruby 不会阻止写入这些变量,但如果它们被重新定义,则会发出警告。