我似乎无法覆盖我的ruby代码中的变量。
我有两个名为table
和updated_table
的2d数组,updated_table
继承了table
的值并且可以正常工作,但是稍后在代码中进行了更改updated_table
的值以及当我尝试将updated_table
设置回table
的相同值(状态)时,这不起作用。
为什么? 我试图做的非常简单的例子。
class SomeClass
table = [[0,20,5,1000,1000], [20,0,10,8,20], [5,10,0,1000,40], [1000,8,1000,0,6], [1000,20,40,6,0]]
updated_table = table
##
then here i have some code that makes changes to the values in the updated_table
##
2.times do
updated_table = table # this dosent work??
## do some more calculations and so on ##
end
end
答案 0 :(得分:2)
当您致电updated_table
时,您table
引用了updated_table = table
。他们都指向完全相同的表格。修改updated_table
后,您实际上同时更新了table
。
我相信你想要updated_table = table.dup
。
答案 1 :(得分:2)
在Ruby中,变量不包含对象本身。他们被称为指向或引用内存中的对象。因此,当您编写updated_table = table
时,您没有复制该对象,而只是创建对该对象的另一个引用。
您可以使用Object#dup
方法创建一个单独但相同的对象。
updated_table = table.dup
这是一个浅表副本,因为数组保存对象的引用,并且这些对象本身不会重复。这意味着原始数组和副本都有效地引用相同的元素,因此如果您需要修改存储在任一数组中的对象,请记住这一点。
答案 2 :(得分:1)
深度复制会实现您的预期结果吗?
我认为你的代码没有按预期工作的原因是每次你对更新的表进行更改时,它会自动更改原始文件,因为你首先复制(引用)它。
我认为object.dup
无法正常工作,因为您的数组是二维的。请参阅此处 - http://ruby.about.com/od/advancedruby/a/deepcopy.htm - 有关object.dup,clone和marshalling主题的进一步阅读(基于数组的示例),以找出原因。
我只是简单地添加了一个片段来深度复制表而不是克隆它。
# Deep copy - http://www.ruby-forum.com/topic/121005
# Thanks to Wayne E. Seguin.
class Object
def deep_copy( object )
Marshal.load( Marshal.dump( object ) )
end
end
table = [[0,20,5,1000,1000], [20,0,10,8,20], [5,10,0,1000,40], [1000,8,1000,0,6], [1000,20,40,6,0]]
updated_table = deep_copy(table) # -- DON'T CLONE TABLE, DEEP COPY INSTEAD --
##
# then here i have some code that makes changes to the values in the updated_table
##
2.times do
updated_table = deep_copy(table) # -- USE DEEP_COPY HERE TOO --
## do some more calculations and so on ##
end