Вау. Вот некоторые уродливые рубин.
Так numвот на самом деле является String(кончик офф являются использование из #subи #=~методов.
listэто Arrayиз
Regexp Объекты и / или
- пары
Regexpи замены Stringобъектов.
Если ни один из заданных Regexpс не соответствовать строке, метод возвращаетnil .
Если непарный Regexpсоответствует строке, метод возвращаетRegexp .
Если сопряженным Regexpсоответствует строке, метод заменяет часть строки , что Regexpматчи с сопряженным текстом замены, и возвращает модифицированныйString .
После того, Regexpсоответствует строке, метод возвращает - не позднее Regexps не рассматриваются.
Ни в коем случае это оригинальный Stringмодифицирована.
Это действительно Франкен-метод, имхо, так как он пытается сделать очень разные вещи.
Пример вызова:
in_list("abe lincoln", [ [/linc/, 'zelda'] ]) #=> "abe zeldaoln"
in_list("abe lincoln", [ [/linc/] ]) #=> /linc/
in_list("abe lincoln", [ [/link/] ]) #=> nil
Действительно, с этим множеством типов возврата, похоже, больше боли в заднице, чем это стоит.
В псевдокоде
DEF IN - LIST ( текст , регэкспы )
FOREACH регулярное_выражение В регулярных выражениях
IF HAS-MATCH ( текст , регулярное выражение )
ЕСЛИ HAS-ЗАМЕНА-TEXT ( регулярное выражение )
ВОЗВРАТ REPLACE-MATCHED-ПОРЦИЯ ( текст , регулярное выражение , GET-ЗАМЕНА-TEXT ( регулярное выражение ))
ELSE
ВОЗВРАТ регулярное_выражение
ENDIF
ENDIF
ENDFOREACH
Не ВОЗВРАТ НИЧЕГО-НАЙДЕНО
ENDDEF
Но, как я сказал, это какой-то уродливая задница рубин. Я бы не использовать его. Это код с запашком, который говорит мне, что есть много неправильно с этим кодом.
Если бы я был массив Regexps, и хотел , чтобы найти первый , который соответствовал какой - то текст, я бы:
# general case
regexps.find { |re| text =~ re }
# example
[ /earn/, /more/, /sessions/, /by/, /sleaving/ ].find { |re| "A baby?" =~ re } # would return /by/
Если у меня была коллекция Regexp, замена текстовых пар, и я хотел бы заменить первый матч в какой - нибудь текст, я бы это сделать
# 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"
Я предпочел бы использовать Hashдля последнего на самом деле, но так , что теряет порядок первоначальный список пришел в (и кто я такой, чтобы сказать , что это не важно, не зная , как он используется), я не сделал.