我试着:

somearray = ["some", "thing"]
anotherarray = ["another", "thing"]
somearray.push(anotherarray.flatten!)

我预期的

["some", "thing", "another", "thing"]

但有

["some", "thing", nil]

当前回答

我发现更容易推入或追加数组,然后将它们压平,如下所示:

somearray = ["some", "thing"]
anotherarray = ["another", "thing"]
somearray.push anotherarray # => ["some", "thing", ["another", "thing"]]
#or
somearray << anotherarray # => ["some", "thing", ["another", "thing"]]
somearray.flatten!  # => ["some", "thing", "another", "thing"]
somearray # => ["some", "thing", "another", "thing"]

其他回答

你有一个可行的想法,但#flatten!在错误的地方——它会使接收器变平,所以你可以用它把[1,2,['foo', 'bar']]变成[1,2,'foo','bar']。

毫无疑问,我忘记了一些方法,但你可以串联起来:

a1.concat a2
a1 + a2              # creates a new array, as does a1 += a2

或预先考虑/追加:

a1.push(*a2)         # note the asterisk
a2.unshift(*a1)      # note the asterisk, and that a2 is the receiver

或接头:

a1[a1.length, 0] = a2
a1[a1.length..0] = a2
a1.insert(a1.length, *a2)

或append和flatten:

(a1 << a2).flatten!  # a call to #flatten instead would return a new array
["some", "thing"] + ["another", "thing"]

只是另一种方法。

[somearray, anotherarray].flatten
=> ["some", "thing", "another", "thing"]

详细阐述@Pilcrow的答案,对于大型数组唯一合适的答案是concat(+),因为它速度快,并且在循环中操作时不会分配一个新对象来进行垃圾回收。

下面是基准:

require 'benchmark'

huge_ary_1 = Array.new(1_000_000) { rand(5_000_000..30_000_00) }

huge_ary_2 = Array.new(1_000_000) { rand(35_000_000..55_000_00) }

Benchmark.bm do |bm|
  p '-------------------CONCAT ----------------'
  bm.report { huge_ary_1.concat(huge_ary_2) }

  p '------------------- PUSH ----------------'
  bm.report { huge_ary_1.push(*huge_ary_2)  }
end

结果:

       user     system      total        real
"-------------------CONCAT ----------------"
  0.000000   0.000000   0.000000 (  0.009388)
"------------------- PUSH ----------------"
  example/array_concat_vs_push.rb:13:in `block (2 levels) in <main>': stack level too deep (SystemStackError)

正如你所看到的,当数组足够大时,使用push会抛出ERROR:堆栈级别太深(SystemStackError)。

a = ['a', 'b']
b = ['c', 'd']
arr = [a, b].flatten

这不会去除dups,但是

a|b

删除重复。