有没有办法保护实例变量不被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
有没有办法让实例变量成为只读?如果没有,我要找哪种属性?
答案 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不会阻止编写这些变量,但如果重新定义它们将发出警告。