将 Ruby .map 的结果附加到数组中?

AnA*_*ice 1 ruby arrays ruby-on-rails

我正在尝试构建一个 items 数组。我正在遍历一个 CSV 文件,当我找到匹配项时,将扩展项目列表。见下面的代码:

items = Array.new
csv.each_with_index do |row,i|
   items << ["a","b","c"].map {|x| row.to_s.gsub(/XXXXXXXXXX/, x.downcase)}
end
puts items.length
Run Code Online (Sandbox Code Playgroud)

这不会返回到所需的项目数组。我是否将地图的结果错误地附加到数组中?

max*_*ner 5

是的,你在这里做错了:

items << ["a","b","c"].map
Run Code Online (Sandbox Code Playgroud)

项目最终会成为一个嵌套数组。这是这里发生的事情的一个例子:

arr = []
arr << [1].map { |x| x }
arr
# => [[1]]
Run Code Online (Sandbox Code Playgroud)

相反,您可以使用+=.

push如果使用 splat 运算符,也可以使用:

arr = []
arr.push *["a","b","c"].map { |x| x }
arr
# => ["a", "b", "c"]
Run Code Online (Sandbox Code Playgroud)

  • 它有一些用途,请参见 [此处](http://blog.honeybadger.io/ruby-splat-array-manipulation-destructuring/)。在这种情况下,`push` 接受顺序参数,所以 `push(:a, :b) == push(*[:a, :b]) == push(*%i{ab})`。最后一个使用速记来构造符号数组。 (2认同)
  • 还有`Array#concat`:`arr.concat %w[abc].map { |x| x }` (2认同)