抱歉这个菜鸟问题...假设我们有:
class TestMe
attr_reader :array
def initialize
@array = (1..10).to_a
end
结束
然后可以这样做:
>> a = TestMe.new
=> #<TestMe:0x00000005567228 @x=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]>
>> a.array.map! &:to_s
=> ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
>> a.array
=> ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
- 这显然不利于封装,不是吗?
- 有什么方法可以快速保护数组变量不被更改吗?
- ...或者每当我的实例变量具有“破坏性”方法时,我是否需要实现一个深拷贝读取器?
编辑 我在某处读到公开数组实例变量是“糟糕的 OO”。如果是真的,为什么?
最佳答案
您不能对 attr_reader
做太多事情,因为 attr_reader :array
生成以下代码:
def array; @array; end
如果你不想暴露数组实例,你可以返回这个数组的Enumerator(外部迭代器)。 Enumerator是一个很好的迭代器抽象,不允许您修改原始数组。
def array; @array.to_enum; end
什么适合封装,什么不适合取决于您的类呈现的抽象。通常这不利于封装暴露对象的内部状态,包括内部数组。您可能希望公开一些在 @array
上运行的方法,而不是公开 @array
(甚至它的迭代器)本身。有时公开数组很好 - 始终查看您的类呈现的抽象。
关于 ruby : how to prevent modification of an array instance variable through an attribute reader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9258969/