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))
有做的最好的办法准确和真实副本的的多维数组的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.
| 归档时间: |
|
| 查看次数: |
3304 次 |
| 最近记录: |