рубин едно покритие, за да създаде хеш
Вчера, докато преминава през една от старите си програми, открих тази написана от мен някой път назад:
#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])
Можете да направите повече неща, основно резултат от блок се използва като ключ за този елемент в резултат хашиш.



































