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

bra*_*rad 17 ruby arrays multidimensional-array

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

array=[[3,4],[5,9],[10,2],[11,3]]
temp_array=array
Run Code Online (Sandbox Code Playgroud)

因为我对temp_array所做的任何修改也都会对数组进行修改,因为我只是复制了对象标识符.我以为我可以通过简单地使用来解决这个问题.

temp_array=array.dup
Run Code Online (Sandbox Code Playgroud)

但是这不起作用,因为temp_array只是一个对象标识符的数组,它会被复制,所以我最终还是修改了初始数组(如果我理解了什么时候出错了).我找到的解决方案是做以下事情;

temp_array=[]
array.each{|sub| temp_array << sub.dup}
Run Code Online (Sandbox Code Playgroud)

这实现了我想要的,但似乎是解决我的问题的尴尬方式.

如果我不知道我的数组将包含什么(例如,如果阵列的某些部分可能具有3维),我担心这将如何工作.我可能必须测试数组的每个成员的类,看看是否必须迭代它才能复制它.根本不是一项不可能的任务,但对我来说似乎很麻烦.这仅仅是Ruby缺乏对多维数组的内置支持的结果,还是有一个简单的内置函数来执行此操作而我错过了?

Isa*_*aac 33

这是处理它的" Ruby-esque "方式:

temp_array = Marshal.load(Marshal.dump(your_array_to_be_cloned))

  • 就是那样.我喜欢在Object.deep_copy中粘贴该代码. (3认同)

Vis*_*gda 5

有做的最好的办法准确真实副本的的多维数组的Ruby是编组

这是编组Ruby语法:

Marshal.load(Marshal.dump(Name_Of_Your_Original_Array))

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

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

在这个例子中,它只创建一个指向数组相同内存位置的对象,它没有做我们数组的真正副本。在这里,如果你修改你的值,temp_array那么它会自动反映原始数组中的array变化,在我们的例子中是可变的。那么我们如何防止原始数组中发生自动更改,我们可以通过编组.

所以!我们如何做到这一点,在示例中,我们需要将数组的真实副本复制到temp_array 中

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

array=[[3,4],[5,9],[10,2],[11,3]] temp_array = Marshal.load(Marshal.dump(array))

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