如何在更改的数组值中正确引用特定状态?

时间:2017-09-20 20:37:42

标签: ruby variables reference

在Ruby中,如何在不与原始对象一起更新的情况下保存引用对象的状态?作为一个粗略的例子......

collection_of_strings = []
a = "String"
collection_of_strings << a
a.some_additive_method              #=> "New String"
collection_of_strings << a 
a.some_other_additive_method        #=> "Another New String"
collection_of_strings << a

collection_of_strings.each do |s|
  puts s
end

#=> ["Another New String", "Another New String", "Another New String"]

相反,我想知道每次如何保存状态,以便最终结果成为

#=> ["String", "New String", "Another New String"]

我知道这是一个非常普遍的问题,所以如果有任何书籍资源可以解决这个问题,那也很棒!提前谢谢!

1 个答案:

答案 0 :(得分:0)

如果不改变使用对象的方式,就无法做到这一点。 Ruby使用通过值传递的指针引用对象。因此,在您的示例中,VM执行以下操作

  1. "String"分配对象,在变量a
  2. 中存储指向它的指针
  3. 将指针从a复制并添加到collection_of_strings
  4. 的末尾
  5. 重复前两次
  6. 所以最后你会得到一个包含三个相同指针的数组,这些指针都指向同一个对象。如果some_additive_method修改了该对象,您将看到更改反映在该对象的每个指针上:acollection_of_strings的所有元素。您必须更改代码,以便最终得到对不同对象的引用,例如

    collection_of_strings = []
    a = "String"
    collection_of_strings << a.dup
    a.some_additive_method
    collection_of_strings << a.dup
    a.some_other_additive_method
    collection_of_strings << a.dup