我想从其形状构建一个多维数组。为此,我编写了这个方法:
def build_array(*shape)
arr = shape[0..-2].reverse.inject(Array.new(shape.last)) do |a, size|
Array.new(size, a)
end
end
的例子:
arr = build_array(2, 8)
=> [[nil, nil, nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil, nil]]
但是,它生成的子数组似乎是同一个对象:
arr.each do |sub|
puts sub.object_id
end
70179850332980
70179850332980
我们如何修复方法,以有一个干净的生成数组?谢谢。
您可以尝试:
def build_array(*shape)
return if shape.empty?
Array.new(shape.shift) { build_array *shape }
end
这个怎么样?
def build(*shape)
return nil if shape.empty?
result = []
count = shape.shift
count.times do |i|
result << build(*shape)
end
result
end
应该可以:
def build_array(*shape)
arr = shape[0..-2].reverse.inject(Array.new(shape.last)) do |a, size|
Array.new(size) { a.clone }
end
end