制作n维矩阵ruby方法

Making an n-dimensional matrix ruby method

首先,让我说我是 Ruby 的新手,我听说过 NArray,但我想看看我是否可以尝试解决这个问题(在你们好人的帮助下)

我了解到我可以做这样的事情:

a=Array.new(2){Array.new(2){Array.new(2,5)}}
=>[[[5, 5], [5, 5]], [[5, 5], [5, 5]]]

来自 Ruby multidimensional array

我尝试制作一个通用函数,可以将任何变量作为维度,并用一个值填充 n 维数组:

def get_n_dimensional(*args, value)
  myarr= Array.new(args[-1],value)
  args.reverse.drop(1).each{ |arg| myarr=Array.new(arg){myarr}}
  return myarr
end

a = get_n_dimensional(2,2,2,value=5)
puts a.inspect
=> [[[5, 5], [5, 5]], [[5, 5], [5, 5]]]

但我可以看到递归引用同一个数组是如何导致问题的:

a[0][1][1]=100
puts a.inspect
=> [[[5, 5], [5, 100]], [[5, 5], [5, 100]]]

我想知道我可以用来解决这个问题的其他策略。我正在考虑构建一个字符串(循环取决于输入维度)并在我的函数中对其进行评估,例如:

eval("Array.new(args[0]){Array.new(args[1]){Array.new(args[2],value)}}"

我想我的部分问题是是否可以像这样依赖 eval

这也是我第一次 post 关于 SO...如果我搞砸了请告诉我

这需要递归方法。

def make_nested_array(*dim, v)
  d, *rest = dim
  Array.new(d) { rest.empty? ? v : make_nested_array(*rest, v) }
end

a = make_nested_array(2,3,4,'hi')
  #=> [
  #     [
  #       ["hi", "hi", "hi", "hi"], ["hi", "hi", "hi", "hi"], ["hi", "hi", "hi", "hi"]
  #     ],
  #     [
  #       ["hi", "hi", "hi", "hi"], ["hi", "hi", "hi", "hi"], ["hi", "hi", "hi", "hi"]
  #     ]
  #   ] 

为了证明没有两个 object_id 是相同的,我们只更改一个元素。

a[1,1,1] = 'cat'
a.flatten
  #=> ["hi", "hi", "hi", "hi", "hi", "hi",  "hi", "hi", "hi", "hi", "hi", "hi",
  #    "hi", "hi", "hi", "hi", "hi", "cat", "hi", "hi", "hi", "hi", "hi", "hi"]