Рассмотрим следующий (изменяемый) пример:
let getRegexFlax flags =
let mutable res = RegexOptions.None
for ch in flags do
match ch with
| 's' -> res <- res ||| RegexOptions.Singleline
| 'x' -> res <- res ||| RegexOptions.IgnorePatternWhitespace
| 'i' -> res <- res ||| RegexOptions.IgnoreCase
| 'm' -> res <- res ||| RegexOptions.Multiline
| _ -> raise (Exception("invalid flag"))
res
Я использовал этот пример, чтобы проиллюстрировать ситуацию, с которой мы часто сталкиваемся. Идея проста: на основе строки (или любого сложного условия) вам нужно объединить ноль или более флагов перечисления.
Я думаю, что самый простой способ сделать это, как указано выше, с изменчивым. Если вы не используете mutable, я могу придумать множество других способов, но ни один из них не кажется очень чистым:
- рекурсивная функция, объединяющая флаги возврата (громоздкая)
enum.Combine
, как предлагает Дон Сайм, с соответствием if-условию или шаблону в каждой записи массива (уродливо)- длинный ряд
|||
комбинированных выражений, каждое из которых имеет условное (также уродливое)
Я уверен, что есть более простой и прямой путь, желательно с сопоставлением с образцом и, конечно же, без изменчивости. Может сейчас поздний час дня, но я просто не могу думать об этом в данный момент, кто-нибудь может показать мне свет?