Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.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_Arrays_Multidimensional Array_Concatenation - Fatal编程技术网

Ruby:如何将数组连接成一个数组

Ruby:如何将数组连接成一个数组,ruby,arrays,multidimensional-array,concatenation,Ruby,Arrays,Multidimensional Array,Concatenation,我在RubyonRails(3.1)中有一个数组,其中所有内部数组的大小都不同。有没有一种方法可以轻松地连接所有内部数组,以获得一个包含所有项的大一维数组 我知道您可以使用Array::concat函数连接两个数组,我可以执行一个循环来按顺序连接它们,如下所示: concatenated = Array.new array_of_arrays.each do |array| concatenated.concat(array) end 但我想知道是否有一个Ruby one衬里可以以更干

我在RubyonRails(3.1)中有一个数组,其中所有内部数组的大小都不同。有没有一种方法可以轻松地连接所有内部数组,以获得一个包含所有项的大一维数组

我知道您可以使用Array::concat函数连接两个数组,我可以执行一个循环来按顺序连接它们,如下所示:

concatenated = Array.new
array_of_arrays.each do |array|
    concatenated.concat(array)
end
但我想知道是否有一个Ruby one衬里可以以更干净的方式完成

谢谢您的帮助。

您正在寻找:

默认情况下,这将递归地展平列表<代码>#展平接受一个可选参数来限制递归深度–文档列出了示例来说明差异。

或更一般地说:

array_of_arrays.reduce(:concat)

你可以使用扁平!方法。如。
a=[1,2,3,4,5]]

a、 展平!#=>[1、2、3、4、5]

这不会以展平的方式破坏3、4或5维以上的阵列;)使用
#flatte
,您需要非常清楚数组包含的内容,因为它是一种递归方法,可能需要也可能不需要。啊,好的。当我用它做类似的事情时,我会记住这一点。在这种情况下,这不是很重要,因为它们是简单的数组,递归工作很好。@d11wtq:这是真的,这就是为什么Ruby 1.9有
flatte(n)
注意,此代码将更改数组的原始
array\u
,如果您仍计划在其他地方使用原始数组,则可能会导致问题。为了避免更改原始数组,您可以执行数组中的数组。reduce:+。但请注意,如果数组中的数组为空,则这两个函数都返回
nil
,而
flatten
返回
[]
。更好的
flatten(1)
。数组中的元素可以是数组本身,它们将被递归展平;建议使用
展平!(n) 
,因为这会就地修改对象,而不是复制对象。通过减少需要执行的GC量,使用就地更改对象的方法可以提高性能。1。这是非常强大的巫术:D2。我不会把它作为一般性的建议,尤其是现在函数式编程是一种模因。但即使不考虑这一点,我也会认为,一般来说,破坏输入是不好的,引用透明性是好的,并且应该使用bang方法作为优化,其中可观察的结果与使用副本的结果相同,除非您有基于程序逻辑的理由想要公开就地突变。正如所建议的,
flatte(1)
是您想要的,但我想指出的是,您可以将上面的内容写成
array\u of\u array.reduce(:concat)
。使用
a.flatte还可以防止对数组进行复制,从而节省内存和垃圾收集。
array_of_arrays.reduce(:concat)