Я написал следующий фрагмент кода Ruby, который используется для извлечения информации с html-страницы.Рефакторинг кода для удаления повторений регулярных выражений
combined = state = county = special = 0
unless options.nil?
unless /([0-9\.]+)% \(Combined\)/.match(options).nil?
combined = /([0-9\.]+)% \(Combined\)/.match(options)[1].to_f
end
unless /([0-9\.]+)% \(State\)/.match(options).nil?
state = /([0-9\.]+)% \(State\)/.match(options)[1].to_f
end
unless /([0-9\.]+)% \(County\)/.match(options).nil?
county = /([0-9\.]+)% \(County\)/.match(options)[1].to_f
end
unless /([0-9\.]+)% \(Special\)/.match(options).nil?
special = /([0-9\.]+)% \(Special\)/.match(options)[1].to_f
end
if combined==0 and state==0 and county==0 and special ==0 then
unless />([0-9\.]+)%</.match(options).nil?
combined = />([0-9\.]+)%</.match(options)[1].to_f
end
end
end
Как отредактировать этот код, чтобы удалить повторение каждого регулярного выражения?
Опять же - отличный ответ. Могу ли я также спросить - почему вы используете .freeze в строках в матче? Я понимаю, что замораживание делает строку неизменной. Это победа в производительности? Или способ показать читателям, что эти строки являются константами? Или предотвратить модификацию? – madcow
Это для исполнения. Без 'freeze' новый экземпляр строки будет генерироваться каждый раз, когда будет читаться эта часть кода, что является огромной тратой ресурсов. 'freeze' после строкового литерала обрабатывается специальным образом, так что он генерируется только один раз. – sawa
@madcow Почему вы удалили свой ответ? Ваш код был чистым и дал правильные результаты. – Alik