ruby 1 podlage za oblikovanje hash

20. avgust 2009 z Prashant · Komentarji
Pila pod: tehnologija

Včeraj, ko je šel skozi enega od mojih starih programov, sem našel to napisal me kdaj nazaj:

#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

Da bi ubil nekaj napetosti naj razkrije, da raw_text izgleda

 

, Desno je bilo izrezano iz paypal potrditvi plačila.

Nad črto, če razdeljene v dele bere bolje:

  unescaped_array = CGI.unescape (raw_text). split ("&")
   unescaped_array = unescaped_array.collect {| x | b = x.split ("="); b.push (nič), če b.size == 1, b}
   flattened_array = unescaped_array.flatten
   hash = Hash [* flattened_array] 

Naredimo posamezne korake v pristopu IRB:

  IRB (glavni). 009:0> unescaped_array = CGI.unescape (raw_text) split ("&")    

 => ["Uspeh", "mc_gross = 10,00", "protection_eligibility = Neupravičeni", "payer_id = U7PPJJ4TSJ47E", "taksa = 0,00", "payment_date = 09:45:30 10 julij 2009 PDT", "= Do payment_status "]                                                                         

 IRB (glavna): 013:0> unescaped_array = unescaped_array.map {| x | b = x.split ("="); b.push (nič), če b.size == 1, b}  

 => [["Uspeh", nič], ["mc_gross", "10,00"] ["protection_eligibility", "Neupravičeni"] ["payer_id", "U7PPJJ4TSJ47E"] ["davek", "0,00"] ["payment_date", "09:45:30 10. julij 2009 PDT"] ["payment_status", "Do"]]                               

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

 => ["Uspeh," je nič, "mc_gross", "10,00", "protection_eligibility", "Neupravičeni", "payer_id", "U7PPJJ4TSJ47E", "davek", "0,00", "payment_date", "09:45: 30 10. julij 2009 PDT "," payment_status "," Do "]
 IRB (glavna): 015:0>
 hash = Hash [* flattened_array]
 => {"Davek" => "0,00", "payment_status" => "Do", "payer_id" => "U7PPJJ4TSJ47E", "mc_gross" => "10,00", "SUCCESS" => nič, "payment_date" = > "09:45:30 10 julij 2009 PDT", "protection_eligibility" => "Neupravičeni"} 

BTW, se imenuje * Hlajenje operater v Ruby

Drug način za ustvarjanje hašiš iz 'paleto parov' je uporaba injicirati:

  hash = [[1,2], [3,4]] injekcijo ({}). {| rezultat, element | Rezultat [element.first] = rezultat [element.last]; rezultat} 

Obstaja še en način :) Napiši zanko, da bom zapustiti kot uresničevanje z bralci!

Tukaj je nekoliko povezano primerov uporabe za ustvarjanje haše od polja:

  IRB (glavna): 005:0> [1,2,3,4,7,9] group_by {| x | x <5.?  : Manj :: večja}

 => {: Manj => [1, 2, 3, 4]: več => [7, 9]} 

To lahko storite več stvari, v bistvu je rezultat bloka uporablja kot ključ za ta element, ki izhaja hash.