Overload [] =用于ruby中深层嵌套的数组

时间:2016-07-11 18:26:15

标签: arrays ruby

我正在研究一个使用任意深度嵌套的数组数组的类。 我想重载[][]=方法,以便我可以更轻松地访问嵌套数组的条目。 我已经[]工作了,但当我嵌套两个以上的深度时,[]=仍然给我带来问题。 这是代码

class Space
  attr_reader :grid

  def initialize(*bounds)
    @dim = bounds.length
    @bounds = bounds
    @grid = create_grid
  end

  def [](*coords)
    entry = @grid
    coords.each { |coord| entry = entry[coord] }
    entry
  end

  def []=(*args)
    row = @grid
    args[0..-3].each { |coord| row = row[coord] }
    row[args[-2]] = args.last
  end

  private

  def create_grid
    sub_grid = nil
    @dim.times do |i|
      sub_grid = Array.new(@bounds[i]) { sub_grid }
    end
    sub_grid
  end
end

如您所见,我迭代地创建一个嵌套深度为@dim的嵌套数组。 如果spaceSpace的实例,我希望space[i,j,...] == space[i][j]...space[i,j,...] = x应与space[i][j]... = x相同 访问元素有效,但赋值不起作用。 我跑的时候

space = Space.new(2,2,2)
space[0,0,0] = true
p space.grid

我希望得到

[[[true, nil], [nil, nil]], [[nil, nil], [nil, nil]]]

但我得到了

[[[true, nil], [true, nil]], [[true, nil], [true, nil]]]

我怀疑问题是ruby在每个级别只保留一个sub_grid的引用。 我通过将create_grid更改为

来部分修复此问题
def create_grid
  sub_grid = nil
  @dim.times do |i|
    sub_grid = Array.new(@bounds[i]) do
      sub_grid.nil? ? nil : sub_grid.dup
    end
  end
  sub_grid
end

所以现在我的输出是

[[[true, nil], [nil, nil]], [[true, nil], [nil, nil]]]

哪个更好,但仍然不是我想要的。 有没有办法得到我想要的东西?

0 个答案:

没有答案