robijn One Liners te creëren hash
Gisteren terwijl er door een van mijn oude programma's, vond ik deze door mij geschreven eens weer:
#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
Om enkele van spanning te doden laat me onthullen dat raw_text lijkt
, Rechts het is gesneden uit PayPal-betaling bevestiging.
Boven regel als gebroken in delen leest beter:
unescaped_array = CGI.unescape (raw_text). split ('&') unescaped_array = unescaped_array.collect {| x | b = x.split ("="); b.push (nihil) als b.size == 1, b} flattened_array = unescaped_array.flatten hash = Hash [* flattened_array]
Laten we de afzonderlijke stappen in irb:
IRB (hoofd):. 009:0> unescaped_array = CGI.unescape (raw_text) split ('&') => ["SUCCES", "mc_gross = 10,00", "protection_eligibility = niet in aanmerking", "payer_id = U7PPJJ4TSJ47E", "belasting = 0.00", "payment_date = 09:45:30 10 juli 2009 PDT", "payment_status = In afwachting van "] IRB (hoofd): 013:0> unescaped_array = unescaped_array.map {| x | b = x.split ("="); b.push (nihil) als b.size == 1, b} => [["Succes", nihil], ["mc_gross", "10,00"], ["protection_eligibility", "niet in aanmerking"], ["payer_id", "U7PPJJ4TSJ47E"], ["belasting", "0.00"] , ["payment_date", "09:45:30 10 juli 2009 PDT"], ["payment_status", "In afwachting van"]] IRB (hoofd): 014:0> flattened_array = unescaped_array.flatten => ["Succes", nihil, "mc_gross", "10,00", "protection_eligibility", "niet in aanmerking", "payer_id", "U7PPJJ4TSJ47E", "belasting", "0.00", "payment_date", "09:45: 30 juli 10 2009 PDT "," payment_status "," In afwachting van "] IRB (hoofd): 015:0> hash = Hash [* flattened_array] => {"Belasting" => "0.00", "payment_status" => "In afwachting van", "payer_id" => "U7PPJJ4TSJ47E", "mc_gross" => "10,00", "SUCCES" => nihil, "payment_date" = > "09:45:30 10 juli 2009 PDT", "protection_eligibility" => "niet in aanmerking"}
BTW, wordt genoemd * splat operator in robijn
Een andere manier om te creëren hash van 'array van paren' is om te injecteren gebruiken:
hash = [[1,2], [3,4]] injecteren ({}). {| resultaat, element | resultaat [element.first] = resultaat [element.last]; resultaat} Er is nog een manier
Schrijf een lus, die ik laat als oefening voor de lezers!
Hier is een beetje los use case van het creëren van hash van arrays:
IRB (hoofd): 005:0> [1,2,3,4,7,9] group_by {| x | x <5.? : Mindere :: groter} => {: Minder => [1, 2, 3, 4]: groter => [7, 9]}
Je kan meer dingen, voornamelijk door het blok wordt gebruikt als sleutel voor dat element in de resulterende hash.



































