Ничего себе. Это какой-то уродливый рубин.
Таким образом, num
здесь на самом деле String
(завершается использование методов #sub
и #=~
.
list
является Array
из
Regexp
объекты и / или
- пар
Regexp
и заменяющих String
объектов.
Если ни один из заданных Regexp
s не соответствует строке, метод возвращает nil
.
Если непарной Regexp
соответствует строка, метод возвращает, что Regexp
.
Если парная Regexp
соответствует строке, метод заменяет часть строки
что Regexp
совпадает с парным текстом замены и возвращает измененный String
.
Как только Regexp
совпадает со строкой, метод возвращает значение - не позднее Regexp
с.
Ни в коем случае оригинал String
не изменяется.
Это действительно откровенный метод, ИМХО, поскольку он пытается делать совершенно разные вещи.
Пример вызова:
in_list("abe lincoln", [ [/linc/, 'zelda'] ]) #=> "abe zeldaoln"
in_list("abe lincoln", [ [/linc/] ]) #=> /linc/
in_list("abe lincoln", [ [/link/] ]) #=> nil
Действительно, с таким множеством возвращаемых типов, это похоже на боль в заднице, чем стоит.
в псевдокоде
DEF <i>IN</i>-<i>LIST</i>( <b>text</b>, <b>regexps</b> )
FOREACH <b>regexp</b> IN <b>regexps</b>
IF <i>HAS-MATCH</i>( <b>text</b>, <b>regexp</b> )
IF <i>HAS-REPLACEMENT-TEXT</i>( <b>regexp</b> )
RETURN <i>REPLACE-MATCHED-PORTION</i>( <b>text</b>, <b>regexp</b>, <i>GET-REPLACEMENT-TEXT</i>(<b>regexp</b>) )
ELSE
RETURN <b>regexp</b>
ENDIF
ENDIF
ENDFOREACH
RETURN <i>NOTHING-FOUND</i>
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
для последнего на самом деле, но так как это теряет порядок, в котором появился оригинальный список (и кто я такой, чтобы сказать
это не важно, не зная, как это используется), я не знал.