рубин один вкладыши для создания хэш-
Вчера при прохождении одного из моих старых программ, я нашел это написано мной некоторое время назад:
#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 выглядит
, Права она была вырезана из PayPal подтверждение оплаты.
Над линией, если нарушена в части читает лучше:
unescaped_array = CGI.unescape (raw_text). раскол ("&") unescaped_array = unescaped_array.collect {| х | = б 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.split ("="); b.push (ноль), если b.size == 1, б} => [["УСПЕХ", ноль], ["mc_gross", "10.00"] ["protection_eligibility", "не имеющие права"] ["payer_id", "U7PPJJ4TSJ47E"] ["налог", "0.00"] , ["payment_date", "9: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" = > "9:45:30 10 июля 2009 PDT", "protection_eligibility" => "Недопустимые"}
Кстати, * называется оператор восклицательный знак в рубине
Еще один способ создать хэш из "массива пар" является использование инъекционных:
хэш = [[1,2], [3,4]] вводят ({}). {| результате элемент | результат [element.first] = результат [element.last];} результат Существует еще один способ
Напишите цикл, который я оставляю в качестве упражнения для читателей!
Вот несколько вариантов использования не связаны создания хэш из массива:
IRB (основные): 005:0> [1,2,3,4,7,9] Аргумент group_by {| х | х | <5.? : Меньше больше ::} => {: Меньше => [1, 2, 3, 4]: большая => [7, 9]}
Вы можете сделать больше вещей, в основном результат блока используется в качестве ключа для этого элемента в результате хэш.



































