我想知道为什么Ruby允许我们更改只读属性。
class Test
attr_reader :h
def initialize
@h = {}
end
end
t = Test.new
t.h # => {}
t.h['name'] = 'somename'
t.h # => {"name"=>"somename"}
我们可以禁止用户这样做吗?
答案 0 :(得分:3)
您的h
字段是对哈希的引用,但您正在更改哈希本身,而不是引用。
答案 1 :(得分:0)
h
是只读的。您无法更改h
中存储的值。但Ruby是面向对象的,一切都是对象,而h
只是一个引用(一个对象指针)。并且没有什么可以阻止您修改h
指向的对象。
答案 2 :(得分:0)
要详细说明@ Sergio的评论,您可以更改@h
的原因是因为attr_reader :h
是简写:
def h
@h
end
因此,定义此方法与设置实例变量@h
无关。