Wow. Questo è un po 'brutto rubino.
Così numqui è in realtà un String(i offs di punta è l'uso della #sube #=~metodi.
listè una Arraydi
Regexp oggetti e / o
- coppie di
Regexpe pezzi Stringoggetti.
Se nessuno dei dati Regexps hanno la stringa, il metodo restituisce nil.
Se un spaiato Regexpcorrisponde alla stringa, il metodo restituisce tale Regexp.
Se un Paired Regexpcorrisponde alla stringa, il metodo sostituisce la parte della stringa che le Regexppartite con il testo sostitutivo abbinato, e restituisce la modifica String.
Una volta che una Regexpcorrisponde alla stringa, il metodo restituisce - entro e non Regexps sono considerati.
In nessun caso è l'originale Stringmodificato.
E 'davvero un Franken-metodo, secondo me, dal momento che sta cercando di fare cose molto diverse.
Un esempio di chiamata:
in_list("abe lincoln", [ [/linc/, 'zelda'] ]) #=> "abe zeldaoln"
in_list("abe lincoln", [ [/linc/] ]) #=> /linc/
in_list("abe lincoln", [ [/link/] ]) #=> nil
In realtà, con quella moltitudine di tipi di ritorno, sembra più di un dolore nel culo di quel che vale.
In pseudo-codice
DEF IN - LISTA ( testo , espressioni regolari )
Foreach regexp IN espressioni regolari
SE HA-PARTITA ( testo , regexp )
SE HA-SOSTITUZIONE-TEXT ( regexp )
RITORNO REPLACE-matched-PARTE ( testo , regexp , GET-SOSTITUZIONE-TEXT ( regexp ))
ALTRO
RITORNO regexp
FINISCI SE
FINISCI SE
endforeach
RITORNO NULLA-TROVATO
ENDDEF
Ma come ho detto, questo è un brutto-ass rubino. Eviterei di usarlo. E 'un code smell che mi dice che c'è un bel po' di sbagliato in questo codice.
Se ho avuto una serie di Regexps, e volevo trovare il primo che ha trovato un testo, mi piacerebbe fare:
# general case
regexps.find { |re| text =~ re }
# example
[ /earn/, /more/, /sessions/, /by/, /sleaving/ ].find { |re| "A baby?" =~ re } # would return /by/
Se avessi una collezione di Regexp, coppie di testo di sostituzione, e ho voluto sostituire la prima partita di un testo, mi piacerebbe fare questo
# 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"
Preferisco utilizzare una Hashper l'ultimo in realtà, ma dal momento che perde l'ordine della lista originale è venuto a (e chi sono io per dire che non è importante, non sapendo come viene usato), non l'ho fatto.