Ruby:多维数组初始化的意外结果



我知道这可能不是很好的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]])

相关内容

  • 没有找到相关文章

最新更新