我正在研究一个使用任意深度嵌套的数组数组的类。
我想重载[]
和[]=
方法,以便我可以更轻松地访问嵌套数组的条目。
我已经[]
工作了,但当我嵌套两个以上的深度时,[]=
仍然给我带来问题。
这是代码
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
的嵌套数组。
如果space
是Space
的实例,我希望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]]]
哪个更好,但仍然不是我想要的。 有没有办法得到我想要的东西?