根据其形状构建多维数组



我想从其形状构建一个多维数组。为此,我编写了这个方法:

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

相关内容

  • 没有找到相关文章

最新更新