Ruby one liners να δημιουργήσει hash

20 του Αυγούστου, 2009 από Prashant
Filed under: τεχνολογία

Χθες περνώντας από ένα από τα παλιά προγράμματα μου, βρήκα αυτό που γράφτηκε από μένα κάποια στιγμή πίσω:

#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 | β = x.split ("="); b.push (μηδέν) αν b.size == 1? β}
   flattened_array = unescaped_array.flatten
   hash = 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 | β = 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 = Hash [* flattened_array]
 => {"Φόρος" => "0,00", "payment_status" => "αναμονή", "payer_id" => "U7PPJJ4TSJ47E", "mc_gross" => "10.00", "επιτυχία" => μηδέν, "payment_date" = > "9:45:30 10 Ιουλ 2009 PDT", "protection_eligibility" => "Μη επιλέξιμες"} 

BTW, * ονομάζεται ράντισμα τηλεφωνίας στην Ruby

Ένας άλλος τρόπος για τη δημιουργία hash από «σειρά ζεύγη» είναι να χρησιμοποιήσετε την ένεση:

  hash = [[1,2], [3,4]] ένεση ({}){| αποτέλεσμα, στοιχείο | αποτέλεσμα [element.first] = αποτέλεσμα [element.last]?. αποτέλεσμα} 

Υπάρχει ένας τρόπος :) Γράψτε ένα βρόχο, που θα αφήσω σαν άσκηση για τους αναγνώστες!

Εδώ είναι λίγο άσχετα περίπτωση τη χρήση της δημιουργίας hash από πίνακες:

  IRB (κύριο): 005:0> [1,2,3,4,7,9] group_by {| x | x <5.;  : Μικρότερο:: μεγαλύτερη}

 => {: Μικρότερο => [1, 2, 3, 4]: μεγαλύτερη => [7, 9]} 

Μπορείτε να κάνετε περισσότερα πράγματα, κυρίως ως αποτέλεσμα του μπλοκ χρησιμοποιείται ως το κλειδί για αυτό το στοιχείο της που απορρέουν hash.

Σχόλια

    blog παρατηρήσεις που κινούνται με Disqus