我在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
是一个其他类型而不是二维数组。
有人可以帮我制作这个阵列的副本吗?
答案 0 :(得分:1)
有两种方法可以在这里工作:(复制或克隆不是完全深层复制,只有Marshal会这样做。)
使用Object#dup或clone。试试@temp = @mastertest.dup
。我不知道Mysql2 :: Result的格式,所以当它像“2-D数组”时,这种方式可能会失败,你必须复制Enumerable-mixed类中的每个元素。 dup
方法只为该类调用initialize_copy
。如果在类似数组的对象中没有POD(普通旧数据),它只会为它做一个浅拷贝。
使用以下两种方法为Mysql2::Result
编写猴子补丁:marshal_dump
和marshal_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]) }