Guau. Es un rubí feo.
Así que numaquí está realmente una String(las propinas son el uso de los métodos #suby #=~.
listes una Arrayde
Regexp objetos y / o
- pares de
Regexpy Stringobjetos de reemplazo .
Si ninguno de los Regexps dados coincide con la cadena, el método retorna nil.
Si un desemparejamiento Regexpcoincide con la cadena, el método lo devuelve Regexp.
Si un emparejado Regexpcoincide con la cadena, el método sustituye la parte de la cadena que Regexpcoincide con el texto de reemplazo emparejado y devuelve el modificado String.
Una vez que a Regexpcoincide con la cadena, el método regresa - no más tarde Regexpse consideran.
En ningún caso es el original Stringmodificado.
Es realmente un método franco, en mi humilde opinión, ya que está tratando de hacer cosas muy diferentes.
Una llamada de ejemplo:
in_list("abe lincoln", [ [/linc/, 'zelda'] ]) #=> "abe zeldaoln"
in_list("abe lincoln", [ [/linc/] ]) #=> /linc/
in_list("abe lincoln", [ [/link/] ]) #=> nil
Realmente, con esa multitud de tipos de devolución, parece más doloroso de lo que vale.
En pseudo-código
DEF IN - LIST ( texto , expresiones regulares )
FOREACH regexp IN regexps
IF HAS-MATCH ( texto , regexp )
SI TIENE REEMPLAZO-TEXTO ( regexp )
RETORNO REPLACE-emparejados PARTE ( texto , expresión regular , GET-SUSTITUCIÓN DE TEXTO- ( expresión regular ))
MÁS
REGRESAR regexp
TERMINARA SI
TERMINARA SI
ENDFOREACH
DEVOLVER NADA ENCONTRADO
ENDDEF
Pero como dije, este es un rubí feo. Evitaría usarlo. Es un código que me dice que hay un montón de errores con este código.
Si tuviera una matriz de Regexps, y quisiera encontrar la primera que concuerde con algún texto, lo haría:
# general case
regexps.find { |re| text =~ re }
# example
[ /earn/, /more/, /sessions/, /by/, /sleaving/ ].find { |re| "A baby?" =~ re } # would return /by/
Si tuviera una colección de Regexppares de texto de reemplazo y quisiera reemplazar la primera coincidencia en algún texto, haría esto
# 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"
Prefiero usar una Hashpara el final en realidad, pero como eso pierde el orden en que entró la lista original (y quién soy yo para decir que no es importante, sin saber cómo se usa), no lo hice.