рубин один вкладыши для создания хэш-

20 августа 2009 по Prashant
Рубрики: технологии

Вчера при прохождении одного из моих старых программ, я нашел это написано мной некоторое время назад:

#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]} 

Вы можете сделать больше вещей, в основном результат блока используется в качестве ключа для этого элемента в результате хэш.

Комментарии

    комментарии блога двигались на большой скорости Diskus