rubis: une ligne pour créer de hachage

20 août 2009 par Prashant
Filed under: la technologie

Hier en passant par l'un de mes anciens programmes, j'ai trouvé cela par écrit par moi ya un certain temps:

#begin magic
hash=Hash[*CGI.unescape(raw_text).split('&').map{|x| b=x.split("=");b.push(nil) if b.size==1;b}.flatten]
#end magic

Pour tuer le suspense permettez-moi de révéler que raw_text ressemble

 

, Le droit qu'il a été coupé de la reconnaissance de paiement paypal.

Au-dessus de la ligne si elle est brisée en pièces se lit mieux:

  unescaped_array = CGI.unescape (raw_text). split ('&')
   unescaped_array = {unescaped_array.collect | x | b = x.split ("="); b.push (néant) si b.size == 1;} b
   flattened_array = unescaped_array.flatten
   hash = Hash [* flattened_array] 

Faisons différentes étapes de la CISR:

  irb (main):. 009:0> unescaped_array = CGI.unescape (raw_text) split ('&')    

 => ["SUCCESS", "mc_gross = 10.00", "protection_eligibility = non admissibles», «payer_id = U7PPJJ4TSJ47E", "impôt = 0.00", "payment_date = 09:45:30 10 juillet 2009 PDT", "payment_status = En attente "]                                                                         

 irb (main): 013:0> unescaped_array = {unescaped_array.map | x | b = x.split ("="); b.push (néant) si b.size == 1;} b  

 => [["SUCCESS", nil], ["mc_gross", "10.00"], ["protection_eligibility", "inadmissible"], ["payer_id", "U7PPJJ4TSJ47E"], ["impôt", "0.00"] , ["payment_date", "09:45:30 10 juillet 2009 PDT"], ["payment_status", "En attente"]]                               

 irb (main): 014:0> flattened_array = unescaped_array.flatten     

 => ["SUCCESS", nil, "mc_gross", "10.00", "protection_eligibility", "inadmissible", "payer_id", "U7PPJJ4TSJ47E", "impôts", "0.00", "payment_date", "09:45: 30 10 juillet 2009 PDT "," payment_status "," En attente "]
 irb (main): 015:0>
 hash = Hash [* flattened_array]
 => {"Impôt" => "0.00", "payment_status" => "En attente", "payer_id" => "U7PPJJ4TSJ47E", "mc_gross" => "10.00", "SUCCESS" => nil, "payment_date" = > "09:45:30 10 juillet 2009 PDT", "protection_eligibility" => "Inadmissible"} 

BTW, * est appelé opérateur splat en ruby

Une autre façon de créer de hachage à partir «tableau de paires" est d'utiliser l'injection:

  hash = [[1,2], [3,4]] injecter ({}). {| résultat, élément | résultat [element.first] = résultat [element.last];} résultat 

Il ya une façon de plus :) Rédiger une boucle, que je vais laisser comme un exercice pour les lecteurs!

Voici un cas d'utilisation sans rapport avec peu de création de hachage à partir des tableaux:

  irb (main): 005:0> [1,2,3,4,7,9] group_by {| x | x <5.?  : Moindre :: plus}

 => {: Moins => [1, 2, 3, 4],: une plus grande => [7, 9]} 

Vous pouvez faire plus de choses, essentiellement suite du bloc est utilisé comme la clé de cet élément dans la table de hachage qui en résulte.

Commentaires

    blog comments powered by Disqus