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