рубин едно покритие, за да създаде хеш

Вчера, докато преминава през една от старите си програми, открих тази написана от мен някой път назад:

#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

За да се умъртвят някои от напрежение нека да оповести този raw_text изглежда

  "УСПЕХ & mc_gross = 10.00 & protection_eligibility = Неприемливи & payer_id = U7PPJJ4TSJ47E & данък = 0.00 & payment_date = 09% 3A45% 3A30 + юли 10% 2С 2009 + PDT & payment_status = До" 

, Нали това е нарязан от PayPal плащане потвърждение.

Над една линия, ако разбити на части прочитания-добре:

  unescaped_array = CGI.unescape (raw_text). разделят ('&')
   unescaped_array = unescaped_array.collect (| X | B = x.split ("="); b.push (нула), ако b.size == 1; б)
   flattened_array = unescaped_array.flatten
   хашиш = Hash [* flattened_array] 

Нека да направим отделни стъпки в IRB:

  IRB (основни): 009:0> unescaped_array = CGI.unescape (raw_text). разделят ('&')    

 => ["Успех", "mc_gross = 10,00", "protection_eligibility = Неприемливи", "payer_id = U7PPJJ4TSJ47E", "данъчните = 0,00", "payment_date = 9:45:30 10-ти Юли, 2009 PDT", "В очакване на payment_status = "]                                                                         

 IRB (основни): 013:0> unescaped_array = unescaped_array.map (| X | B = x.split ("="); b.push (нула), ако b.size == 1; б)  

 => [["Успех", нула], ["mc_gross", "10,00 "],[" protection_eligibility", "Не могат"], ["payer_id", "U7PPJJ4TSJ47E"], ["данък", "0,00"] , ["payment_date", "09:45:30 10-ти Юли, 2009 г PDT"], ["payment_status", "В очакване"]]                               

 IRB (основни): 014:0> flattened_array = unescaped_array.flatten     

 => ["Успех", нула "mc_gross", "10,00", "protection_eligibility", "Не могат", "payer_id", "U7PPJJ4TSJ47E", "данъци", "0,00", "payment_date", "9:45: 30 юли, 10 г, 2009 PDT "," payment_status "," В очакване "]
 IRB (основни): 015:0>
 хашиш = Hash [* flattened_array]
 => ("Данък" => "0,00", "payment_status" => "До", "payer_id" => "U7PPJJ4TSJ47E", "mc_gross" => "10,00", "успех" => нулев, "payment_date" = > "09:45:30 10-ти юли 2009 година PDT", "protection_eligibility" => "Не могат") 

BTW, * се нарича кръгче оператор в рубин

Друг начин за създаване на хашиш от "масив от двойки" е да се използва инжектиране:

  хашиш = [[1,2], [3,4]]. инжектира ({}){| резултат елемент | резултат [element.first] = резултат [] element.last; резултат) 

Има още един начин :) Напиши линия, че ще си отида като упражнение за читателя!

Тук е малко несвързан случай използването на създаване на хашиш от масиви:

  IRB (основни): 005:0> [1,2,3,4,7,9]. group_by (| X | X <5?  : По-малка:: по-голяма)

 => (: По-малка => [1, 2, 3, 4],: голяма => [7, 9]) 

Можете да направите повече неща, основно резултат от блок се използва като ключ за този елемент в резултат хашиш.