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

标签 ruby arrays multidimensional-array

<分区>

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

因此在您的方法中,当您遍历行时,您会重复更改同一数组的值。

要修复它,请为每一行创建一个新数组,而不是 1 个被引用 5 次的数组。这可以使用 Array 的 block 初始化变体来完成。像这样的东西:

@test = Array.new(size) { Array.new(size) }

查看 the docs有关数组初始化的不同方法的更多解释。

关于Ruby:多维数组初始化的意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7541085/

相关文章:

ruby - Appium - 等待 webview 加载

ruby-on-rails - 按天对 Mongoid 对象进行分组

arrays - 在 MATLAB 中将函数分布在数组的单个维度上?

sql - 三维数据库表

c - 数组中的随机数、最大值、最小值、平均值

javascript - 返回最大数数组

multidimensional-array - lua:90: 尝试索引字段 '?' (零值)

ruby-on-rails - Ruby 中的动态验证和元编程

ruby-on-rails - 在数据库列中存储逗号分隔的列表,如何获取和设置?

javascript - 在本地存储中存储命名数组时,Stringify 不起作用