Можно ли строго типизировать целые числа для определенных диапазонов?

Может ли Rust строго вводить целые числа в определенные диапазоны?

Например, я хотел бы определить тип для представления месяцев, который может быть [1 .. 12] включительно. Проверка диапазона вызовет панику, если эта переменная выйдет за пределы этого диапазона.


person Listerone    schedule 23.09.2019    source источник
comment
Не в ядре, нет. Вам нужно будет построить enum или struct или два поверх основных типов. Вы также можете подумать, как вы будете генерировать исключения на языке, который не имеет их в качестве основной функции (некоторые ящики эмулируют их с помощью макросов), а также ;-)   -  person Sébastien Renauld    schedule 24.09.2019
comment
@SébastienRenauld То же, что и остальная часть Rust при переполнении/недостаточном переполнении. Он вызывает панику в режиме отладки и не проверяется в рабочей среде.   -  person Listerone    schedule 24.09.2019
comment
Паниковать по умолчанию и без альтернативы, наверное, слишком строго, на мой взгляд. Конечно, я не знаю вашего варианта использования, но наверняка есть более одного случая, когда возврат Result, а не паника, был бы предпочтительнее (и поэтому его было бы легко реализовать с реализацией TryFrom)   -  person Sébastien Renauld    schedule 24.09.2019
comment
контейнер ux может представлять интерес. Его размеры ограничены степенью двойки, но вы получаете такие типы, как u3 и i42.   -  person Peter Hall    schedule 24.09.2019
comment
Если вы можете использовать нестабильные функции, вы можете реализовать свой собственный диапазонный целочисленный тип, используя константные дженерики. Эргономика будет не такой приятной, как встроенная поддержка типов дальнего боя, но вы должны получить некоторые из преимуществ, которые вы ищете. (Во многих случаях пользовательский тип для конкретного варианта использования, вероятно, является лучшим вариантом.)   -  person Sven Marnach    schedule 24.09.2019
comment
Если rust может иметь зависимый тип, это будет круто.   -  person edwardw    schedule 24.09.2019