Sensationnel. C'est un peu ruby laid.
Donc , numici est en fait un String(les compromis pointe étant l'utilisation des #subet #=~méthodes.
listest un Arraydes
Regexp des objets et / ou
- paires de
Regexpet remplacement des Stringobjets.
Si aucune des données Regexps correspondent à la chaîne, la méthode retourne nil.
Si un apparié Regexpcorrespond à la chaîne, la méthode retourne que Regexp.
Si un apparié Regexpcorrespond à la chaîne, la méthode substitue la partie de la chaîne que les Regexpmatchs avec le texte de remplacement associé, et renvoie la modification String.
Une fois un Regexpcorrespond à la chaîne, retourne la méthode - au plus tard Regexps sont considérés.
En aucun cas , l'original est Stringmodifié.
Il est vraiment une Franken méthode, à mon humble avis, car il essaie de faire des choses très différentes.
Un exemple d'appel:
in_list("abe lincoln", [ [/linc/, 'zelda'] ]) #=> "abe zeldaoln"
in_list("abe lincoln", [ [/linc/] ]) #=> /linc/
in_list("abe lincoln", [ [/link/] ]) #=> nil
En fait, avec cette multitude de types de retour, il semble que plus d'une douleur dans le cul que ça vaut le coup.
En pseudo-code
DEF EN - LISTE ( texte , regexps )
FOREACH regexp EN regexps
SI HAS-MATCH ( texte , regexp )
SI HAS-REPLACEMENT-TEXT ( regexp )
RETOUR REPLACE-appariée PORTION ( texte , regexp , GET-REMPLACEMENT-TEXTE ( regexp ))
AUTRE
RETOUR regexp
FIN SI
FIN SI
endforeach
RETOUR RIEN TROUVE-
enddef
Mais comme je l'ai dit, c'est une ruby-cul laid. Il faut éviter de l'utiliser. Il est un codesmell qui me dit qu'il ya beaucoup de mal à ce code.
Si je devais un tableau de Regexps, et je voulais trouver le premier qui correspondait à un texte, je le ferais:
# general case
regexps.find { |re| text =~ re }
# example
[ /earn/, /more/, /sessions/, /by/, /sleaving/ ].find { |re| "A baby?" =~ re } # would return /by/
Si j'avais une collection de Regexppaires de texte de remplacement, et je voulais remplacer le premier match dans un texte, je ferais ceci
# 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"
Je préfère utiliser un Hashpour la dernière en fait, mais depuis que perd l'ordre de la liste initiale est venu (et qui suis - je dire que c'est pas important, ne sachant pas comment il est utilisé), je ne l' ai pas.