Вот альтернативный подход, который дает вам тот же результат, но не использует переключатель. Если вы поместите ваши регулярные выражения в массив, вы можете сделать что-то вроде этого:
res = [ /pat1/, /pat2/, ... ]
m = nil
res.find { |re| m = foo.match(re) }
# Do what you will with `m` now.
Объявление m
вне блока позволяет ему оставаться доступным после того, как find
выполнено с блоком и find
остановится, как только блок вернет истинное значение, поэтому вы получаете такое же быстрое поведение, что и переключатель. Это дает вам полный MatchData
, если вам это нужно (возможно, вы хотите использовать именованные группы захвата в своих регулярных выражениях) и приятно отделяет ваши регулярные выражения от логики поиска (что может давать или не давать более четкий код) Вы можете даже загрузить свои регулярные выражения из конфигурационного файла или выбрать, какой набор из них вы хотите во время выполнения.