0

我在 Ruby 中有这样的声明:

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

所以现在我想复制这个二维数组,因为如果我做类似@temp = @mastertest的事情,@mastertest当我对@temp.

我尝试使用以下内容:

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

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

有人可以帮我如何制作这个数组的副本吗?

4

3 回答 3

1

这里有两种工作方式:(复制或克隆不是完全深度复制,只有 Marshal 可以)。

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

  2. Mysql2::Result用两种方法编写你的猴子补丁:marshal_dumpmarshal_load. 这将使它对Marshal.dump. 在此处查看有关 Marshal的文档。

于 2012-10-17T09:42:30.683 回答
0

尝试

@temp = @mastertest.clone

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

于 2012-10-17T09:50:49.917 回答
0

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

@new_array = Array.new
@mastertest.each { |r| @new_array.push(r[0]) }
于 2012-10-19T18:16:04.690 回答