为什么允许更改属性?

时间:2016-03-30 16:54:12

标签: ruby

我想知道为什么Ruby允许我们更改只读属性。

class Test
  attr_reader :h

  def initialize
    @h = {}
  end
end

t = Test.new
t.h # => {}
t.h['name'] = 'somename'
t.h # => {"name"=>"somename"}

我们可以禁止用户这样做吗?

3 个答案:

答案 0 :(得分:3)

您的h字段是对哈希的引用,但您正在更改哈希本身,而不是引用。

答案 1 :(得分:0)

h是只读的。您无法更改h中存储的值。但Ruby是面向对象的,一切都是对象,而h只是一个引用(一个对象指针)。并且没有什么可以阻止您修改h指向的对象。

答案 2 :(得分:0)

要详细说明@ Sergio的评论,您可以更改@h的原因是因为attr_reader :h是简写:

def h
  @h
end

因此,定义此方法与设置实例变量@h无关。