Вы можете взять страницу из того, как Argu обрабатывает аргументы командной строки, и сделать что-то вроде этого:
type OfferingFlags =
| Waved
| RequiresSalt
| OfferedWithFrankincense
| ShouldBeBroughtToCorner
| EntirelyBurnt
Тогда тип MealOffering
может выглядеть так: [1116 ]
type MealOffering =
{
Offering: Offering
Flour: AccompanyingMealOfferings
Flags: OfferingFlags list
}
Флаг , отсутствующий в списке , представляет значение false
, а флаг, представленный в списке, представляет значение true
для этого флага. То есть, чтобы проверить, требует ли приношение соли, вы должны сделать:
offering.Flags |> List.contains RequiresSalt
И список сопутствующих приношений пищи (для которых требуется соль, полностью сожжен, но не ] нужно помахать, подвести к углу или предложить с ладаном), будет выглядеть так:
[ RequiresSalt; EntirelyBurnt ]
Преимущество этого метода моделирования заключается в том, что независимо от того, сколько у вас флагов, вы можете добавить новый флаг без необходимости редактирования типа MealOffering
. Это также может быть недостатком, потому что, когда вы моделируете каждый флаг отдельно как bool
, каждый раз, когда вы добавляете новый флаг, компилятор заставляет вас рассматривать его везде - тогда как, моделируя его как список значений DU, компилятор не заставит вас проверять новый флаг RequiresSomethingElse
в тех местах, где это нужно сделать. НО, если вы думаете, что вы закончили добавление новых флагов, или если любой новый флаг, который вы добавляете, должен также по умолчанию установить значение false
, то подход OfferingFlags list
, как правило, является хорошим.
Я нашел следующие две библиотеки:
А-ч, и конечно, я разорвал те сайты от этого спокойного вопроса о Mailinglist об Архивировании/Разархивации каталогов :)
Просто для записи ...
Сегодня мне нужно было сделать что-то очень похожее в Visual C ++. (Хотя хотелось сохранить возможность компилировать проект на других платформах, однако предпочитал не принимать Qt только для этой цели.)
Завершено использованием библиотеки Minizip . Он написан на простом C, но разработка простой оболочки C ++ вокруг него была легкой задачей, и конечный результат отлично работает, по крайней мере, для моих целей.