有没有一种简单的方法可以在Ruby中复制多维数组?

有没有一种简单的方法可以在Ruby中复制多维数组?,ruby,arrays,multidimensional-array,Ruby,Arrays,Multidimensional Array,我有一个Ruby中的二维数组,我想生成它的工作副本。显然我不能这样做 array=[[3,4],[5,9],[10,2],[11,3]] temp_array=array 因为我对temp_数组所做的任何修改也将对数组进行修改,因为我只是复制了对象标识符。我想我可以通过简单的使用 temp_array=array.dup 但这不起作用,因为temp_数组只是一个对象标识符的数组,它会被复制,所以我仍然会修改初始数组(如果我知道我这样做的时候出了什么问题的话)。我找到的解决办法是做以下事情:

我有一个Ruby中的二维数组,我想生成它的工作副本。显然我不能这样做

array=[[3,4],[5,9],[10,2],[11,3]]
temp_array=array
因为我对temp_数组所做的任何修改也将对数组进行修改,因为我只是复制了对象标识符。我想我可以通过简单的使用

temp_array=array.dup
但这不起作用,因为temp_数组只是一个对象标识符的数组,它会被复制,所以我仍然会修改初始数组(如果我知道我这样做的时候出了什么问题的话)。我找到的解决办法是做以下事情:

temp_array=[]
array.each{|sub| temp_array << sub.dup}
temp_数组=[]
数组。每个{| sub | temp_数组下面是处理它的“Ruby-esque”方法:

temp\u array=Marshal.load(Marshal.dump(要克隆的\u array))
尝试以下操作:

temp_array = array.clone

您可以按指定使用
array.clone
。这将为您提供原始对象的副本,而不仅仅是指针。

正如其他人所指出的,您可以使用clone。但是,这不起作用,因为它是一个浅层副本,所以子数组(我认为这不是真正的多维数组)不会被克隆。由于数组在Ruby中是可变对象,子数组将被更改。例如,请检查此项

>> blah = [[3,5],6]
=> [[3, 5], 6]
>> joe = blah.clone
=> [[3, 5], 6]
>> joe[0]
=> [3, 5]
>> joe[0].push "blah"
=> [3, 5, "blah"]
>> blah
=> [[3, 5, "blah"], 6]
正如你们所见,仅仅做克隆是行不通的。但你们知道这一点,所以提出了你们的问题

这是我刚刚编造的。在你找到真正的Ruby方法之前(我只是在Ruby中工作,我不是专家)

def dup_递归(新_数组、旧_数组)
旧_数组。每个do|项|
如果item.class==数组

新建_array尝试在阵列中的每个子阵列上运行array.dup

    c = []
    array.each do |row|
      c << row.dup
    end
c=[]
array.do每行|
c您可以使用的:

>> require 'deep_enumerable'

>> array=[[3,4],[5,9],[10,2],[11,3]]

>> temp_array=array.deep_dup
>> array.each{|sub| sub << "XXX"}

>> array
=> [[3, 4, "XXX"], [5, 9, "XXX"], [10, 2, "XXX"], [11, 3, "XXX"]]

>> temp_array
=> [[3, 4], [5, 9], [10, 2], [11, 3]]
>要求“深度可枚举”
>>数组=[[3,4],[5,9],[10,2],[11,3]]
>>temp\u array=array.deep\u dup
>>数组。每个{|子|子>数组
=>[[3,4,“XXX”],[5,9,“XXX”],[10,2,“XXX”],[11,3,“XXX”]]
>>temp_阵列
=> [[3, 4], [5, 9], [10, 2], [11, 3]]

在Ruby中创建多维数组的精确真实副本的最佳方法是编组

以下是编组的Ruby语法:

Marshal.load(Marshal.dump(原始数组的名称))

让我们看看如何使用上面的例子使用这个语法

array=[[3,4]、[5,9]、[10,2]、[11,3]]
临时数组=数组

在本例中,它只创建一个指向数组相同内存位置的对象,而不是数组的真实副本。在这里,如果修改
temp_数组
的值,那么它将自动反映原始数组中的更改,而原始数组在本例中是
数组
变量。那么我们如何防止automatic更改发生在原始数组中,我们可以通过编组来完成

那么!我们如何做到这一点呢?在本例中,我们需要将数组的真实副本复制到临时数组

让我们看看,如何做到这一点:

array=[[3,4]、[5,9]、[10,2]、[11,3]]
临时数组=封送处理加载(封送处理转储(数组))


现在,我们已经完成了多维数组的真实副本,如果您修改
temp\u数组的任何值
,那么更改将不会反映原始
数组

,就是这样。我喜欢将该代码粘贴到Object中。deep\u copy.太好了,谢谢。这实际上也向我解释了整个编组过程(尽管我需要去多读一些书,才能真正了解它)。这实际上是一段很好的代码。我担心我会写这段代码来处理这个问题,但做得比我本应该做的要好得多。有趣的是,有很多人直接去克隆解决方案——这个问题显然没有被很多Ruby人很好地理解。也许是真的,Brad,但另一方面,may你得到的是一个糟糕的样本(人、答案)。可能是一天中的时间、问题的措辞或其他任何东西。也可能是这个问题没有被许多红宝石学家理解。不幸的是,Rails让你完全不必理解任何东西:)
>> require 'deep_enumerable'

>> array=[[3,4],[5,9],[10,2],[11,3]]

>> temp_array=array.deep_dup
>> array.each{|sub| sub << "XXX"}

>> array
=> [[3, 4, "XXX"], [5, 9, "XXX"], [10, 2, "XXX"], [11, 3, "XXX"]]

>> temp_array
=> [[3, 4], [5, 9], [10, 2], [11, 3]]