从其形状构建多维数组

时间:2014-05-22 21:45:40

标签: ruby arrays multidimensional-array shape

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

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

我们如何修复方法以获得干净的生成数组?感谢。

3 个答案:

答案 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