Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby中创建多维零数组?_Ruby - Fatal编程技术网

如何在Ruby中创建多维零数组?

如何在Ruby中创建多维零数组?,ruby,Ruby,要创建一维数组,我可以写: arr = Array.new(10) { |z| 0 } #=> [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 但我想知道如何在更多维度上初始化数组,例如: #=> [[0, 0, 0], [0, 0, 0], [0, 0, 0]] 这只是一个例子。我试图了解一般情况。试试看:) UPD:对于多维is: arr = Array.new(10, Array.new(2, 0)) => [[0, 0], [0, 0], [0, 0]

要创建一维数组,我可以写:

arr = Array.new(10) { |z| 0 }
#=> [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
但我想知道如何在更多维度上初始化数组,例如:

#=> [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
这只是一个例子。我试图了解一般情况。

试试看:)

UPD:对于多维is:

arr = Array.new(10, Array.new(2, 0))
=> [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]

如果“更多维度”是指数组的数组,则可以尝试:

arr = Array.new(10){|z| z=Array.new(2,0)}
# => [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0,0]]

假设您的第二个维度是
2

,您也可以这样做:

Array.new(10, 0).each_slice(2).to_a
# => [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]

5.times.map{Array.new(2, 0)}
# => [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]

您可以轻松嵌套多个呼叫:

请注意,非块版本,即
Array.new(2,0)
,应仅用于不可变对象,因为相同的对象将用于所有元素。有关详细信息,请参见本节

要构建任意维度的数组,可以使用递归:

def multi_array(sizes, default = nil)
  size, *remaining = sizes
  if remaining.empty?
    Array.new(size, default)
  else
    Array.new(size) { multi_array(remaining, default) }
  end
end

multi_array([4, 3, 2], 0)
#=> [[[0, 0], [0, 0], [0, 0]],
#    [[0, 0], [0, 0], [0, 0]],
#    [[0, 0], [0, 0], [0, 0]],
#    [[0, 0], [0, 0], [0, 0]]]

这是另一种方式,尽管我觉得每个级别的深度复制都可以简化:

def make_multi(dimensions, default)
  dimensions.reverse.each_with_index.reduce([]) { |a,(d,i)|
    Array.new(d) { i.zero? ? default : Marshal.load(Marshal.dump(a)) } }
end

arr = make_multi [4,3,2,2], 0
  #=> [[[[0, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]]],
  #    [[[0, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]]],
  #    [[[0, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]]],
  #    [[[0, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]]]] 

arr[0][0][0][0] = 1
arr
  #=> [[[[1, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]]],
  #    [[[0, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]]],
  #    [[[0, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]]],
  #    [[[0, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]]]] 

arr = make_multi [4,3,2,2], {}
  #=> [[[[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]]],
  #    [[[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]]],
  #    [[[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]]],
  #    [[[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]]]]

arr[0][0][0][0] = { a: 1 }
arr
  #=> [[[[{:a=>1}, {}...] # all but the first are empty hashes

你能给出一个你想要生成的结果的例子吗?顺便说一句,赋值没有任何作用。@Stefan不确定你的意思…你可以只写
Array.new(10){z|0}
甚至
Array.new(10){0}
或者不写块
Array.new(10,0)
。关于您的编辑:结果总是二维的还是这只是一个例子?您可以删除
|z | z=
部分不清楚“第二维度是2”是什么意思。你的意思是“二维数组的大小/长度是2”吗?是的,这就是我的意思。对于编辑后的部分,请注意,这会生成一个重复相同数组实例的数组,这对大多数初学者来说是一个难题。@sawa你能再解释一下吗?@orestiss try
arr[0]数组。新的(2,0)应该是[0,0]在第一行
Array.new(size){remaining.empty??默认值:multi_Array(remaining,default)}
读起来更好?@CarySwoveland我想让代码保持简单,尽可能接近“静态”示例。所谓“静态”,你是指不可变的
default
?@CarySwoveland不,只是我的初始示例,即
Array.new(2,0)
数组。新的(3){…}
。我认为在递归方法中准确地使用这些方法调用(传递大小和默认值与大小和块)会有所帮助。
def multi_array(sizes, default = nil)
  size, *remaining = sizes
  if remaining.empty?
    Array.new(size, default)
  else
    Array.new(size) { multi_array(remaining, default) }
  end
end

multi_array([4, 3, 2], 0)
#=> [[[0, 0], [0, 0], [0, 0]],
#    [[0, 0], [0, 0], [0, 0]],
#    [[0, 0], [0, 0], [0, 0]],
#    [[0, 0], [0, 0], [0, 0]]]
def make_multi(dimensions, default)
  dimensions.reverse.each_with_index.reduce([]) { |a,(d,i)|
    Array.new(d) { i.zero? ? default : Marshal.load(Marshal.dump(a)) } }
end

arr = make_multi [4,3,2,2], 0
  #=> [[[[0, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]]],
  #    [[[0, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]]],
  #    [[[0, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]]],
  #    [[[0, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]]]] 

arr[0][0][0][0] = 1
arr
  #=> [[[[1, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]]],
  #    [[[0, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]]],
  #    [[[0, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]]],
  #    [[[0, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]]]] 

arr = make_multi [4,3,2,2], {}
  #=> [[[[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]]],
  #    [[[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]]],
  #    [[[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]]],
  #    [[[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]]]]

arr[0][0][0][0] = { a: 1 }
arr
  #=> [[[[{:a=>1}, {}...] # all but the first are empty hashes