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

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
   = хэш хэша [* 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>
 = хэш хэша [* 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