рубін один вкладиш для створення хеш-

Вчора при проходженні одного з моїх старих програм, я знайшов це написано мною якийсь час назад:

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

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