Wow. Det er noen stygge rubin.
Så numher er faktisk en String(spiss offs være bruk av #subog #=~metoder.
lister en Arrayav
Regexp objekter og / eller
- parene
Regexpog erstatnings Stringobjekter.
Hvis ingen av de gitte Regexps matche strengen, som metoden returnerer nil.
Hvis et uparet Regexpsamsvarer med strengen, returnerer den metode som Regexp.
Dersom en sammenkoblet Regexpsamsvarer med strengen, idet fremgangsmåten erstatter den del av strengen som til Regexpfyrstikker med den sammenkoblede erstatningsteksten, og returnerer den modifiserte String.
Når en Regexpmatcher strengen, returnerer metoden - senest Regexps er vurdert.
I noen tilfeller er det opprinnelige Stringendret.
Det er virkelig en Franken-metoden, IMHO, siden den prøver å gjøre veldig forskjellige ting.
Et eksempel samtale:
in_list("abe lincoln", [ [/linc/, 'zelda'] ]) #=> "abe zeldaoln"
in_list("abe lincoln", [ [/linc/] ]) #=> /linc/
in_list("abe lincoln", [ [/link/] ]) #=> nil
Virkelig, med det mangfold av returtyper, virker det som mer av en smerte i ræva enn det er verdt.
I pseudo-kode
DEF IN - LIST ( tekst , regexps )
Foreach regexp I regexps
IF HAR-MATCH ( tekst , regexp )
IF HAR-ERSTATNING-TEKST ( regexp )
RETURN BYTT matchet-DELER ( tekst , regexp , GET-BYTTE-TEKST ( regexp ))
ELLERS
RETURN regexp
SLUTT OM
SLUTT OM
ENDFOREACH
RETURN INGENTING-FUNNET
ENDDEF
Men som jeg sa, dette er litt stygg-ass rubin. Jeg ville unngå å bruke det. Det er en codesmell som forteller meg at det er en hel masse galt med denne koden.
Hvis jeg hadde en rekke Regexps, og ønsket å finne den første som matchet litt tekst, vil jeg gjøre:
# general case
regexps.find { |re| text =~ re }
# example
[ /earn/, /more/, /sessions/, /by/, /sleaving/ ].find { |re| "A baby?" =~ re } # would return /by/
Hvis jeg hadde en samling av Regexp, utskifting tekst parene, og jeg ønsket å erstatte den første kampen i tekst, vil jeg gjøre dette
# 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"
Jeg vil heller bruke en Hashfor siste faktisk, men siden den mister rekkefølgen den opprinnelige listen kom inn (og hvem er jeg til å si det er ikke viktig, uten å vite hvordan det brukes), jeg gjorde ikke det.