Ruby garnituri de a crea un hash

20 august 2009 de Prashant
Filed under: tehnologie

Ieri în timp ce trece printr-unul din programele mele vechi, am găsit acest lucru scris de mine cândva înapoi:

#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

Pentru a ucide o parte de suspans permiteţi-mi să dezvăluie că arată ca raw_text

 

, Dreapta a fost redus de la confirmarea de plată PayPal.

Deasupra liniei, dacă rupt în părţi mai prevede:

  unescaped_array = CGI.unescape (raw_text). Split ("&")
   unescaped_array = unescaped_array.collect {| x | = b x.split ("="); b.push (zero) în cazul în b.size == 1; b}
   flattened_array = unescaped_array.flatten
   hash = Hash [* flattened_array] 

Să facem pasi individuali din IRB:

  IRB (principal):. 009:0> unescaped_array = CGI.unescape (raw_text), Split ("&")    

 => ["De succes", "mc_gross = 10.00", "protection_eligibility = neeligibile", "payer_id = U7PPJJ4TSJ47E", "taxa = 0.00", "payment_date = 09:45:30 10 iulie 2009 PDT", "payment_status = aşteptare "]                                                                         

 IRB (principal): 013:0> unescaped_array = unescaped_array.map {| x | = b x.split ("="); b.push (zero) în cazul în b.size == 1; b}  

 => [["De succes", zero], ["mc_gross", "10.00"], ["protection_eligibility", "neeligibile"], ["payer_id", "U7PPJJ4TSJ47E"], ["impozit", "0.00"] , ["payment_date", "09:45:30 10 iulie 2009 PDT"], ["payment_status", "aşteptare"]]                               

 IRB (principal): 014:0> flattened_array = unescaped_array.flatten     

 => ["Succes", zero, "mc_gross", "10.00", "protection_eligibility", "neeligibile", "payer_id", "U7PPJJ4TSJ47E", "impozit", "0.00", "payment_date", "09:45: 30 10 iulie 2009 PDT "," payment_status "," aşteptare "]
 IRB (principal): 015:0>
 hash = Hash [* flattened_array]
 => {"Impozit" => "0.00", "payment_status" => "În aşteptarea", "payer_id" => "U7PPJJ4TSJ47E", "mc_gross" => "10.00", "succesul" => zero, "payment_date" = > "09:45:30 10 iulie 2009 PDT", "protection_eligibility" => "neeligibile"} 

BTW, * se numeşte operator de bulină în Ruby

Un alt mod de a crea de distribuire de "matrice de perechi", este de a utiliza injectaţi:

  hash = [[1,2], [3,4]] injecta ({}). {| urmare, elementul de | rezultat [element.first] = rezultat [element.last];} rezultat 

Există o modalitate mai :) Scrie o buclă, pe care o voi lăsa ca un exerciţiu de cititori!

Aici este un caz pic de utilizare independent de crearea de reţele de distribuire din:

  IRB (principal): 005:0> [1,2,3,4,7,9] group_by {| x | x <5.?  : Mai mică :: mai mare}

 => {: Mai mică => [1, 2, 3, 4],: o mai mare => [7, 9]} 

Puteţi face mai multe lucruri, în principal din cauza bloc este folosit ca o cheie pentru acel element din hash rezultat.

Comentarii

    comentarii blog powered by Disqus