Beeindruckend. Das ist einige hässliche Rubin.
Also numhier ist eigentlich eine String(die Spitze offs die Verwendung des Wesens #subund #=~Methoden.
listist eine Arrayvon
Regexp Objekte und / oder
- Paare
Regexpund StringErsatzobjekten.
Falls keine der angegebenen Regexps entsprechen die Zeichenfolge, die Methode zurückgibt nil.
Wenn ein ungepaarten Regexpdie Zeichenfolge übereinstimmt, gibt die Methode , dass Regexp.
Wenn Sie ein gekoppeltes Regexpder Zeichenfolge übereinstimmt, ersetzt das Verfahren den Teil der Zeichenfolge , dass die RegexpBegegnungen mit dem gekoppelten Ersetzungstext und gibt die modifizieren String.
Sobald eine Regexpder Zeichenfolge übereinstimmt, gibt die Methode - nicht später Regexps berücksichtigt werden.
In keinem Fall ist die ursprüngliche Stringgeändert.
Es ist wirklich ein franken-Methode, IMHO, da es sehr verschiedene Dinge zu tun versucht.
Ein Beispiel Aufruf:
in_list("abe lincoln", [ [/linc/, 'zelda'] ]) #=> "abe zeldaoln"
in_list("abe lincoln", [ [/linc/] ]) #=> /linc/
in_list("abe lincoln", [ [/link/] ]) #=> nil
Wirklich, mit dieser Vielzahl von Rückgabetypen, wie es scheint eher einen Schmerz im Arsch, als es wert ist.
In Pseudo-Code
DEF IN - LIST ( Text , regexps )
FOREACH regexp IN regexps
IF HAS-MATCH ( Text , regexp )
IF HAS-ERSATZ-TEXT ( regexp )
RETURN REPLACE-Matched-PORTION ( Text , regexp , GET-ERSATZ-TEXT ( regexp ))
SONST
RETURN regexp
ENDIF
ENDIF
endforeach
RETURN NICHTS-GEFUNDEN
ENDDEF
Aber wie gesagt, das ist einige hässliche Esel Rubin. Ich würde mit ihm vermeiden. Es ist ein codesmell, die mich gibt es eine ganze Menge falsch mit diesem Code teilt.
Wenn ich eine Reihe von hatte Regexps, und wollte die ersten finden , die einen Text abgestimmt, würde ich tun:
# general case
regexps.find { |re| text =~ re }
# example
[ /earn/, /more/, /sessions/, /by/, /sleaving/ ].find { |re| "A baby?" =~ re } # would return /by/
Wenn ich eine Sammlung von hatte Regexp, Ersatztextpaare, und ich wollte das erste Spiel in einem Text ersetzen, würde ich dies tun
# 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"
Ich würde eher eine Verwendung Hashfür das letzte wirklich, aber da , dass die Reihenfolge , in der ursprünglichen Liste kam verliert (und wer bin ich sagen , dass nicht wichtig ist, nicht zu wissen , wie es verwendet wird ), habe ich nicht.