制作n维矩阵ruby方法

时间:2017-02-11 03:39:36

标签: ruby eval

首先,请允许我说我是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这样的

这也是我关于SO的第一篇文章......如果我搞砸了,请告诉我

1 个答案:

答案 0 :(得分:2)

这需要一个递归方法。

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"]