Как добавить несколько массивов данных в массив с помощью метода .each - PullRequest
1 голос
/ 22 июля 2010

У меня есть следующий метод:

def speciate 
  chem_formula.each { |chemical|
    @chem_species = chemical.scan(/[A-Z][^A-Z]*/)
    puts @chem_species
  }
end

, который производит:

H2
S
O4

@chem_species = ["S", "O4"]

от: @chem_formula = ["H2" "SO4"]

Как настроить массив для включения всех итераций? Именно так вы выводите ["H2", "S", "O4"] вместо ["S", "O4"] Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 22 июля 2010

Не самый элегантный, так как вы строите массив, затем выравниваете, но это работает:

@chem_formula.map{|chem| chem.scan(/[A-Z][^A-Z]*/) }.flatten
0 голосов
/ 23 июля 2010

Элегантный способ:

@chem_formula.flat_map{|chem| chem.scan(/[A-Z][^A-Z]*/) }

Примечание : flat_map - это Ruby 1.9.2+.Вы можете require 'backports/1.9.2/enumerable/flat_map', если используете более старый Ruby, или использовать map{}.flatten(1).

0 голосов
/ 22 июля 2010
def speciate
  @chem_species = []
  chem_formula.each { |chemical|
    @chem_species.concat(chemical.scan(/[A-Z][^A-Z]*/))
    puts @chem_species
  }
end
...