Wauw. Dat is een lelijke robijn.
Dus numhier is eigenlijk een String(de tip offs die het gebruik van de #suben #=~methoden.
listeen Arrayvan
Regexp voorwerpen en / of
- paren
Regexpen vervanging Stringvoorwerpen.
Als geen van de gegeven Regexps deze tekenreeks, retourneert de methode nil.
Als een ongepaard Regexpovereenkomt met de string, retourneert de methode die Regexp.
Als een gepaarde Regexpovereenkomt met de string, de methode vervangt het deel van de string die de Regexpwedstrijden met de gepaarde vervangende tekst, en geeft de gewijzigde String.
Zodra een Regexpovereenkomt met de string, retourneert de methode - uiterlijk Regexps worden beschouwd.
In geen enkel geval is de oorspronkelijke Stringgewijzigd.
Het is echt een franken-methode, IMHO, omdat het probeert om heel andere dingen te doen.
Een voorbeeld gesprek:
in_list("abe lincoln", [ [/linc/, 'zelda'] ]) #=> "abe zeldaoln"
in_list("abe lincoln", [ [/linc/] ]) #=> /linc/
in_list("abe lincoln", [ [/link/] ]) #=> nil
Echt, met die veelheid aan terugkeer types, het lijkt erop dat meer een pain in the ass dan het waard is.
In pseudo-code
DEF IN - LIST ( tekst , regexps )
Foreach regexp IN regexps
IF HAS-MATCH ( tekst , regexp )
IF HAS-VERVANGING-TEXT ( regexp )
RETURN VERVANGEN afgestemd portie ( tekst , regexp , GET-VERVANGING-TEXT ( regexp ))
ANDERS
RETURN regexp
STOP ALS
STOP ALS
ENDFOREACH
RETURN NIETS-GEVONDEN
ENDDEF
Maar zoals ik al zei, dit is een lelijke-ass robijn. Ik wil voorkomen dat het gebruik het. Het is een codesmell die me vertelt dat er is een heleboel mis met deze code.
Als ik een serie van gehad Regexps, en wilde de eerste die wat tekst gematched vinden, zou ik doe:
# general case
regexps.find { |re| text =~ re }
# example
[ /earn/, /more/, /sessions/, /by/, /sleaving/ ].find { |re| "A baby?" =~ re } # would return /by/
Als ik had een collectie van Regexp, vervangende tekst paren, en ik wilde de eerste wedstrijd te vervangen in een tekst, zou ik dit doen
# 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"
Ik zou liever gebruik maken van een Hashvan de laatste eigenlijk, maar aangezien dat verliest de volgorde waarin de oorspronkelijke lijst kwam (en wie ben ik om te zeggen dat is niet belangrijk, niet wetend hoe het gebruikt wordt), dat deed ik niet.