2d数组变量覆盖在ruby中不起作用?

时间:2011-03-05 03:02:20

标签: ruby

我似乎无法覆盖我的ruby代码中的变量。

我有两个名为tableupdated_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

3 个答案:

答案 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