Ruby one liners να δημιουργήσει hash
Χθες περνώντας από ένα από τα παλιά προγράμματα μου, βρήκα αυτό που γράφτηκε από μένα κάποια στιγμή πίσω:
#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.



































