Ruby:如何防止通过属性读取器修改数组实例变量

前端之家收集整理的这篇文章主要介绍了Ruby:如何防止通过属性读取器修改数组实例变量前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
对不起这个noob的问题…让我们说我们有:
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","10"]

>这显然是针对封装,不是吗?
有没有办法快速保护数组变量不被更改?
> …或者每次我的实例变量具有“破坏性”的方法时,是否需要实现深度拷贝阅读器?

编辑我读到某处它是“糟糕的OO”暴露数组实例变量.如果是真的,为什么?

解决方法

你不能用attr_reader做太多,因为attr_reader:array生成以下代码
def array; @array; end

如果不想公开数组实例,可以返回此数组的枚举器(外部迭代器). Enumerator是一个很好的迭代器抽象,不允许您修改原始数组.

def array; @array.to_enum; end

对于封装有什么好处,什么不依赖于你的类提供的抽象.通常,这对封装来暴露对象的内部状态(包括内部数组)是不利的.您可能想要公开一些在@array上操作的方法,而不是暴露@array(甚至它的迭代器)本身.有时暴露数组是很好的 – 总是看看你的类的抽象.

猜你在找的Ruby相关文章