在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"]
我知道这是一个非常普遍的问题,所以如果有任何书籍资源可以解决这个问题,那也很棒!提前谢谢!
答案 0 :(得分:0)
如果不改变使用对象的方式,就无法做到这一点。 Ruby使用通过值传递的指针引用对象。因此,在您的示例中,VM执行以下操作
"String"
分配对象,在变量a
a
复制并添加到collection_of_strings
所以最后你会得到一个包含三个相同指针的数组,这些指针都指向同一个对象。如果some_additive_method
修改了该对象,您将看到更改反映在该对象的每个指针上:a
和collection_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