有没有办法保护实例变量不被写入/修改在 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 不会阻止写入这些变量,但如果它们被重新定义,则会发出警告。