将2-D数组复制到Ruby中的另一个数组

时间:2012-10-17 09:20:01

标签: ruby-on-rails ruby arrays ruby-on-rails-3 multidimensional-array

我在Ruby中有这样的声明:

@mastertest = connection.execute("select code_ver from mastertest")

所以现在我想制作这个2-D数组的副本,因为如果我执行类似@temp = @mastertest的操作,当我对@mastertest进行任何更改时,会对@temp进行更改

我尝试使用以下内容:

@temp = Marshal.load(Marshal.dump(@mastertest))

但这给我一个错误"no marshal_dump is defined for class Mysql2::Result"。所以我假设@mastertest是一个其他类型而不是二维数组。

有人可以帮我制作这个阵列的副本吗?

3 个答案:

答案 0 :(得分:1)

有两种方法可以在这里工作:(复制或克隆不是完全深层复制,只有Marshal会这样做。)

  1. 使用Object#dup或clone。试试@temp = @mastertest.dup。我不知道Mysql2 :: Result的格式,所以当它像“2-D数组”时,这种方式可能会失败,你必须复制Enumerable-mixed类中的每个元素。 dup方法只为该类调用initialize_copy。如果在类似数组的对象中没有POD(普通旧数据),它只会为它做一个浅拷贝。

  2. 使用以下两种方法为Mysql2::Result编写猴子补丁:marshal_dumpmarshal_load。这将使其回复Marshal.dump。请参阅文档about Marshal here

答案 1 :(得分:0)

尝试

@temp = @mastertest.clone

现在对@temp的更改不会影响@mastertest

答案 2 :(得分:0)

我设法使用以下方法解决了这个问题:

@new_array = Array.new
@mastertest.each { |r| @new_array.push(r[0]) }