Wow. Asta e un rubin urât.
Deci , numaici este de fapt o String(offs vârful fiind la utilizarea #subși #=~metode.
listeste Arrayde
Regexp obiecte și / sau
- perechi de
Regexpși de înlocuire a Stringobiectelor.
Dacă nici unul dintre date Regexps se potrivesc șirului, metoda revine nil.
În cazul în care un nepereche se Regexppotrivește cu șirul, metoda returneaza asta Regexp.
În cazul în care un Paired se Regexppotrivește cu șirul, metoda substituie parte din șirul că Regexpmeciurile cu textul de înlocuire asociat, și returnează Modificate String.
Odată ce o se Regexppotrivește cu șirul, metoda se întoarce - nu mai târziu Regexps sunt luate în considerare.
În nici un caz este original Stringmodificat.
Este într-adevăr o Franken-metodă, IMHO, din moment ce încearcă să facă lucruri foarte diferite.
Un exemplu de apel:
in_list("abe lincoln", [ [/linc/, 'zelda'] ]) #=> "abe zeldaoln"
in_list("abe lincoln", [ [/linc/] ]) #=> /linc/
in_list("abe lincoln", [ [/link/] ]) #=> nil
Într-adevăr, cu acea multitudine de tipuri de returnare, se pare ca mai mult de o durere în fund decât merită.
În pseudo-cod
DEF IN - LISTA ( text , regexps )
Foreach regexp ÎN regexps
DACĂ ARE-POTRIVIRE ( text , regexp )
IF HAS-SCHIMB-TEXT ( regexp )
RETURN REPLACE-MATCHED-PORȚIE ( text , regexp , GET-SCHIMB-TEXT ( regexp ))
ELSE
RETURN regexp
ENDIF
ENDIF
ENDFOREACH
RETURN GĂSIT NIMIC-
ENDDEF
Dar, cum am spus, acest lucru este un rubin urât-fund. Mi-ar evita utilizarea acestuia. Este un codesmell care îmi spune că o mulțime întreagă în neregulă cu acest cod.
Dacă aș fi avut o serie de Regexps, și a vrut să găsească primul care corespund cu un text, aș face:
# general case
regexps.find { |re| text =~ re }
# example
[ /earn/, /more/, /sessions/, /by/, /sleaving/ ].find { |re| "A baby?" =~ re } # would return /by/
Dacă aș fi avut o colecție de Regexp, perechi de text de înlocuire, și am vrut să înlocuiască primul meci într - un text, aș face acest lucru
# 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"
Mi - ar folosi mai degrabă o Hashpentru ultima , de fapt, dar din moment ce pierde ordinea lista originală a venit (și cine sunt eu să spun că nu e important, nu știe cum este folosit), nu am făcut -o .