Ουάου. Αυτή είναι κάποια άσχημη ρουμπίνι.
Έτσι, numεδώ είναι στην πραγματικότητα ένα String(τα συμβουλή offs είναι η χρήση του #subκαι #=~μεθόδων.
listείναι ένας Arrayαπό
Regexp αντικείμενα και / ή
- ζεύγη
Regexpκαι αντικατάσταση Stringαντικείμενα.
Αν καμία από τις δεδομένες Regexps ταιριάζει με το string, η μέθοδος επιστρέφει nil.
Εάν ένα αταίριαστο Regexpταιριάζει με το string, η μέθοδος επιστρέφει αυτό Regexp.
Εάν μια αξιόπιστη Regexpταιριάζει με το string, η μέθοδος αντικαθιστά το μέρος του string ότι οι Regexpαγώνες με το αντίστοιχο κείμενο αντικατάστασης και επιστρέφει το τροποποιημένο String.
Μόλις ένα Regexpταιριάζει με το string, η μέθοδος επιστρέφει - το αργότερο RegexpΤα s θεωρείται.
Σε καμία περίπτωση το αρχικό Stringτροποποιηθεί.
Είναι πραγματικά μια Franken-μέθοδο, IMHO, δεδομένου ότι προσπαθεί να κάνει πολύ διαφορετικά πράγματα.
Ένα παράδειγμα κλήσης:
in_list("abe lincoln", [ [/linc/, 'zelda'] ]) #=> "abe zeldaoln"
in_list("abe lincoln", [ [/linc/] ]) #=> /linc/
in_list("abe lincoln", [ [/link/] ]) #=> nil
Πραγματικά, με το πλήθος των τύπων επιστροφή, φαίνεται ότι περισσότερο από ένα πόνο στο γάιδαρο από ό, τι αξίζει.
Σε ψευδο-κώδικα
DEF ΣΤΟΝ - LIST ( κείμενο , regexps )
Foreach regexp ΣΤΟΝ regexps
ΑΝ ΕΧΕΙ-MATCH ( κείμενο , regexp )
IF ΗΑδ-ΑΝΤΙΚΑΤΑΣΤΑΣΗΣ-ΚΕΙΜΕΝΟ ( regexp )
ΕΠΙΣΤΡΟΦΗ REPLACE-συμφωνημένα-ΤΜΗΜΑΤΟΣ ( κείμενο , regexp , GET-ΑΝΤΙΚΑΤΑΣΤΑΣΗ-TEXT ( regexp ))
ΑΛΛΟΥ
ΕΠΙΣΤΡΟΦΗ regexp
ΤΕΛΟΣ ΕΑΝ
ΤΕΛΟΣ ΕΑΝ
ENDFOREACH
ΕΠΙΣΤΡΟΦΗ ΤΙΠΟΤΑ-ΒΡΕΘΗΚΕ
ENDDEF
Αλλά όπως είπα, αυτό είναι κάποιο ρουμπίνι άσχημο-κώλο. Θα αποφύγετε τη χρήση του. Είναι μια codesmell που μου λέει ότι υπάρχει ένα πάρα πολύ λάθος με αυτόν τον κωδικό.
Αν είχα μια σειρά από Regexps, και ήθελε να βρει το πρώτο που ταιριάζουν κάποιο κείμενο, θα ήθελα να κάνω:
# general case
regexps.find { |re| text =~ re }
# example
[ /earn/, /more/, /sessions/, /by/, /sleaving/ ].find { |re| "A baby?" =~ re } # would return /by/
Αν είχα μια συλλογή Regexp, ζευγάρια κείμενο αντικατάστασης, και θα ήθελα να αντικαταστήσει τον πρώτο αγώνα με κάποιο κείμενο, θα ήθελα να το κάνουμε αυτό
# general case
text_dupe = text.dup
pairs.find { |re,replace| text_dupe.sub!( re, replace ) }
# example
text_dupe = "One two three four".dup
[ [/ape/, 'frog'], [/our/, 'my'] ].find { |re,replace| text_dupe.sub!( re, replace } } # would return "One two three fmy"
Θα προτιμούσα να χρησιμοποιήσετε ένα Hashγια το τελευταίο στην πραγματικότητα, αλλά δεδομένου ότι χάνει τη σειρά η αρχική λίστα ήρθε (και ποιος είμαι εγώ να πω ότι δεν είναι σημαντικό, μην ξέροντας πώς έχει χρησιμοποιηθεί), δεν το έκανα.