加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 22:46:02 所属栏目:百科 来源:网络整理
导读:对不起这个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"
对不起这个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(甚至它的迭代器)本身.有时暴露数组是很好的 – 总是看看你的类的抽象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读