首先,请允许我说我是Ruby的新手并且我听说过NArray但是我想看看我是否可以尝试解决这个问题(在你这些好人的帮助下)
我了解到我可以这样做:
a=Array.new(2){Array.new(2){Array.new(2,5)}}
=>[[[5, 5], [5, 5]], [[5, 5], [5, 5]]]
我尝试制作一个通用函数,可以将任何变量作为维度,并使用值填充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的第一篇文章......如果我搞砸了,请告诉我
答案 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"]