Ruby Κωδικός Αίτησης Μετάφρασης

ψήφοι
0

Έχω αμελητέα γνώση Ruby σύνταξη και ήλπιζα κάποιος θα την καλοσύνη να μεταφράσει τη λειτουργία κάτω σε ψευδοκώδικα και, ενδεχομένως, να αποτελέσει παράδειγμα για το πώς θα λέγεται;

def in_list(num, list) 
   list = [*list] 
   list.each {|a,b| return (b)? num.sub(a,b) : a if num =~ a} 
   nil 
end
Δημοσιεύθηκε 15/07/2009 στις 10:51
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
12

Ουάου. Αυτή είναι κάποια άσχημη ρουμπίνι.

Έτσι, 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για το τελευταίο στην πραγματικότητα, αλλά δεδομένου ότι χάνει τη σειρά η αρχική λίστα ήρθε (και ποιος είμαι εγώ να πω ότι δεν είναι σημαντικό, μην ξέροντας πώς έχει χρησιμοποιηθεί), δεν το έκανα.

Απαντήθηκε 15/07/2009 στις 12:03
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more