我知道这可能不是很好的Ruby风格,但我正在学习…这是怎么回事?具体来说,为什么我的数组的第一行是第二行的副本,当我认为我初始化(复制)数组参数testa的值到@test,保持所有的索引相同?
class Test
def initialize (size, testa)
@test = Array.new(size, Array.new(size));
(1..size).each { |r|
(1..size).each { |c|
@test[r-1][c-1] = testa[r-1][c-1];
puts("#{r}, #{c}: #{@test[r-1][c-1]}");
}
}
end
end
t= Test.new(2,[[1,2],[3,4]]) #=> @test=[[3, 4], [3, 4]]
您看到的问题的原因是您初始化数组的方式。您在方法调用中传递了一个新初始化的数组,该数组用作每行的值。
# Your initialization
@test = Array.new(size, Array.new(size));
# The following is equivalent, and perhaps more illustrative of what's happening
@a = Array.new(size)
@test = Array.new(size, @a) # effective result => [@a, @a, @a, @a, @a]
所以在你的方法中,当你遍历行时,你是在反复改变同一个数组的值
要解决这个问题,请为每一行创建一个新数组,而不是一个被引用5次的数组。这可以使用Array
的块初始化变体来完成。比如:
@test = Array.new(size) { Array.new(size) }
查看文档,了解Array初始化的不同方法。
参见:http://www.ruby-doc.org/core/classes/Array.html to Array。新(尺寸、obj)
是用obj的大小副本创建的(即对相同obj的大小引用)
对象'Array.new(size)'每一行都是相同的对象。
试题:@test = Array.new(size) { Array.new(size) };
或其他实现到您的代码:
class Test
def initialize(array)
@test = array.map{|ar| Array.new(ar) }
end
end
t = Test.new([[1,2],[3,4]])