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(甚至它的迭代器)本身.有时暴露数组是很好的 – 总是看看你的类的抽象. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |