2010-07-22 1 views
1

je la méthode suivante:Comment ajouter plus d'un morceau de données à un tableau suivre la méthode de .each

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

qui produit:

H2 
S 
O4 

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

de: @chem_formula = ["H2" "SO4"]

Comment définir le tableau pour inclure toutes les itérations? Voilà comment sortir ["H2", "S", "O4"] plutôt que ["S", "O4"] Merci d'avance.

+0

Je ne comprends pas votre question. –

Répondre

1

Pas le plus élégant que vous construisez un tableau, puis aplatir, mais cela fonctionne:

@chem_formula.map{|chem| chem.scan(/[A-Z][^A-Z]*/) }.flatten 
+0

Je ne suis pas d'accord, ce * est * élégant :) – Leventix

+0

Je ne dis pas si élégant qu'il existe plusieurs itérations de tableau se passe ici sous le capot. Bien que oui, c'est une ligne et * regarde * très jolie et élégante, je pense que trop de développeurs Ruby ont oublié que ces fonctions de tableau Ruby .each, .map etc ... passent par tous les tableaux, les rendant relativement lents à un algorithme construit sur mesure . c'est à dire. cela pourrait certainement être réalisé avec quelques lignes de code et une seule itération. – brad

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

Une façon élégante est:

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

Remarque: flat_map est Ruby 1.9.2+. Vous pouvez require 'backports/1.9.2/enumerable/flat_map' si vous utilisez un ancien Ruby, ou utilisez map{}.flatten(1).

Questions connexes