rubis: une ligne pour créer de hachage
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.



































