我想从形状构建一个多维数组。 为此,我写了这个方法:
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
我们如何修复方法以获得干净的生成数组?感谢。
答案 0 :(得分:6)
您可以尝试:
def build_array(*shape)
return if shape.empty?
Array.new(shape.shift) { build_array *shape }
end
答案 1 :(得分:0)
这个怎么样?
def build(*shape)
return nil if shape.empty?
result = []
count = shape.shift
count.times do |i|
result << build(*shape)
end
result
end
答案 2 :(得分:0)
这应该有效:
def build_array(*shape)
arr = shape[0..-2].reverse.inject(Array.new(shape.last)) do |a, size|
Array.new(size) { a.clone }
end
end