ruby : how to prevent modification of an array instance variable through an attribute reader

标签 ruby arrays encapsulation instance-variables getter

抱歉这个菜鸟问题...假设我们有:

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/

相关文章:

python - 织物导入错误 : "fab task" vs. "from fabfile import task; task()"

Java数据字段封装newby问题

c++ - 为什么我们将对象而不是对象成员传递给函数?

c - 如何用 C 中的数组解决这个问题?

ruby - 删除重复字符的正则表达式

arrays - 这个数组语法在 Ruby 中意味着什么?

ruby-on-rails - 将模块添加到测试类

javascript - 在 Node.js 中使用 Express 渲染数组中的每个对象

arrays - 如何根据该值创建索引列表并从中创建一个新数组? MATLAB

html - 在 Watir Ruby 中访问顺序相同的元素