Опциональный тип — тип?
Для "значение либо есть, либо его нет" (без сопутствующего сообщения об
ошибке — этим он отличается от результат из Т выше) есть отдельный,
более простой опциональный тип: тип?. Внутри — та же обёртка из двух
псевдополей: .есть (верно) и .значение (валидно, только если
.есть истинно):
целое? возраст = 25; // "поднимается" неявно — просто пиши обычное значение
целое? неизвестно = неуказано; // явное отсутствие значения
если (возраст.есть)
вывести(целое_в_текст(возраст.значение));
конец
// Переприсваивание работает так же:
неизвестно = 30; // теперь есть
неизвестно = неуказано; // снова нет
В отличие от результат из Т (требующего явного успех(x)/ошибка(msg)),
опциональный тип неявно поднимает обычное значение до тип? —
короче для частого случая "значение почти всегда есть".
⚠️ Честные ограничения v1
Tограничен скалярными типами — целочисленные любого размера,
дробные, верно. Текст и структуры как T не поддержаны — они
потребовали бы той же ARC-инфраструктуры владения (копирование при
обёртывании, освобождение при перезаписи/выходе из области видимости),
что и результат из текста/результат из Структура, которая для
опционального типа пока не реализована.
- Опциональный тип поддержан только для локальных переменных —
как параметр функции, тип возврата функции или поле структуры он пока честно отклоняется с понятной ошибкой, а не падает молча.
- Нет
?-оператора автоматического распространения (как у
результат из Т внутри функций, объявленных : результат из ...) —
разворачивать нужно вручную через .есть/.значение.