在Ruby中使实例变量只读?

时间:2013-11-18 05:44:14

标签: 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

有没有办法让实例变量成为只读?如果没有,我要找哪种属性?

3 个答案:

答案 0 :(得分:4)

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

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方法。

答案 1 :(得分:2)

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

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

除了写@var之外,它会使你的代码更糟糕。

答案 2 :(得分:0)

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