diff --git a/source/app.d b/source/app.d index 82117e0..d568df7 100644 --- a/source/app.d +++ b/source/app.d @@ -12,6 +12,7 @@ int main(string[] args) "Проверяет наличие исполняемого файла в директориях,указанных в переменной окружения PATH")) .add(new Command("splittext", "Форматирует массив строк, разбивая их на строки указанной длины")) + .add(new Command("variant", "Динамическая работа с разными типами данных в одной переменной")) ) .add(new Command("ncurses", "Использование библиотеки ncurses") .add(new Command("menu", "Интерактивное консольное меню")) @@ -27,6 +28,7 @@ int main(string[] args) argumets .on("common", (common) { common + .on("variant", (variant) { fVariant(); }) .on("splittext", (splittext) { formatLines(); }) .on("isexists", (isexists) { isExists(); }); }) diff --git a/source/examples/common/README.md b/source/examples/common/README.md index bd1b1dc..d9c46cc 100644 --- a/source/examples/common/README.md +++ b/source/examples/common/README.md @@ -7,3 +7,7 @@ ## isexists Функция `isExecutableExists` проверяет наличие исполняемого файла `appName` в директориях, указанных в переменной окружения `PATH`. Разбивает `PATH` на директории, формирует полный путь к файлу и проверяет его существование и тип (файл). Возвращает `true`, если файл найден, иначе `false`. Использует модули `std.process`, `std.file`, `std.path`, `std.array`. + +## variant + +Функция `fVariant` демонстрирует использование типа `Variant` из модуля `std.variant` для работы с данными разных типов. Вспомогательная функция `getValue` возвращает `Variant`, содержащий `int` (42) при `arg=1`, `string` ("Hello, D!") при `arg=2` или `DList!int` ([1, 2, 3]) в остальных случаях. `fVariant` выводит тип и значение для каждого случая, преобразуя `DList!int` в массив для отображения. Использует модули `std.variant`, `std.container`, `std.stdio`, `std.array`. diff --git a/source/examples/common/package.d b/source/examples/common/package.d index 68466fa..237287f 100644 --- a/source/examples/common/package.d +++ b/source/examples/common/package.d @@ -2,3 +2,4 @@ module examples.common; public import examples.common.isexists; public import examples.common.splittext; +public import examples.common.variant; diff --git a/source/examples/common/variant.d b/source/examples/common/variant.d new file mode 100644 index 0000000..b4ffce7 --- /dev/null +++ b/source/examples/common/variant.d @@ -0,0 +1,49 @@ +module examples.common.variant; + +import std.variant; +import std.container; +import std.stdio : writeln; +import std.array : array; + +// Возвращает Variant с разными типами в зависимости от arg. +private auto getValue(int arg) +{ + /** + * `Variant` в D — это тип из модуля `std.variant`, + * который может хранить значение любого типа + * (int, string, объекты, списки и т.д.) и позволяет + * динамически определять его тип во время выполнения. + * Используется для гибкой работы с данными, + * когда тип заранее неизвестен. + */ + Variant result; + if (arg == 1) + { + result = 42; // int + } + else if (arg == 2) + { + result = "Hello, D!"; // string + } + else + { + DList!int list = [1, 2, 3]; // DList!int + result = list; + } + return result; +} + +// Показывает типы и значения, возвращаемые getValue. +void fVariant() +{ + // Вывод для arg=1 (int) + writeln("Тип при arg=1: ", getValue(1).type, ", значение: ", getValue(1)); + + // Вывод для arg=2 (string) + writeln("Тип при arg=2: ", getValue(2).type, ", значение: ", getValue(2)); + + // Вывод для arg=0 (DList!int) + auto listVariant = getValue(0); + writeln("Тип при arg=0: ", listVariant.type, ", значение: ", array( + listVariant.get!(DList!int))); +} diff --git a/source/examples/version_.d b/source/examples/version_.d index a6a7618..da7b942 100644 --- a/source/examples/version_.d +++ b/source/examples/version_.d @@ -1,3 +1,3 @@ module examples.version_; -enum examplesVersion = "0.5.0"; +enum examplesVersion = "0.6.0";