Rust Types - Taxonomy
От Nikita Bishonen • 4 минут чтения •
Привет! Сегодня я делюсь своими мыслями о таксономии типов в Раст. Это первая версия таксономии и поста, буду благодарен за любые идеи по её улучшению.
Таксономия
Таксоно́мия (от др.-греч. τάξις — строй, порядок и νόμος — закон) — учение о принципах и практике классификации и систематизации сложноорганизованных иерархически соотносящихся сущностей.
Я захотел украсить свой кабинет графической иллюстрацией “таксономии” системы типов данных, схожей с той, что использует Раст. К сожалению мои поиски не принесли желаемый результат и я решил сделать свою иллюстрацию и делюсь ею с вами в этой публикации.
Типы
Теории
Теорий существует множество, некоторые из которых обусловлены историей развития науки о вычислениях, другие имеют действительную практическую ценность и теоретическое обоснование. Приведу ссылки на две популярные теории из обеих категорий:
Но не буду пытаться вдаваться в детали, поскольку понимаю их со скрипом, что уж говорить о способности их объяснить.

Теории типов и Раст
Собственно основным вопросом, ответ на который я искал - теория типов стоящая за Раст и её проекция на типы, которые мы используем при написании кода на Раст. Не я один задавался таким вопросом: https://users.rust-lang.org/t/practical-intro-to-type-theory/18204/5 Также есть небольшой доклад на эту тему: https://av.tib.eu/media/52178 “Ментальная модель”: https://ia0.github.io/unsafe-mental-model/type-theory.html А также интересный пост: https://www.kurtlawrence.info/blog/category-theory-with-rust-pt1 Но все они имеют много букв и не имеют “всеобъемлющего” графика, чтобы я повесил его на стену.
Таксономия Раст Типов

В итоге я, на основании своих познаний в теории, составил первый вариант такой таксономии. Я очень люблю использовать деревья (особенно бинарные), для выстраивания иерархий, мне кажется что так легче навигироваться и понимать их суть. Сама по себе визуализация и является конечно целью этой публикации, но для интересующихся и неискушённых читателей я привожу некоторые пояснения и ссылки ниже.
П-тип
Тип произведение ни дать, ни взять. Мы компануем несколько типов в один, получаем произведение возможных значений этих типов как новое множество значений. Какие типы в Раст его реализуют?
- Кортеж: Tuple
- Структура: Struct
- Кортеж-Структура: Tuple Struct
- Единичная структура: Unit-Like Struct
- Массив: Array
- Срез: Slice
Σ-тип
Тип-сумма в отличии от П-типа, тип-сумма даёт более строгий контроль над возможными значениями используемых типов.
- Перечисление: Tagged Union
- Опцион: Option
- Результат: Result
Типы-указатели
Раст имеет возможности для работы с памятью, поэтому язык содержит в себе и ссылки и указатели. Нас же интересуют только “высокоуровневые” концепции.
- Ссылки: References
- Умные указатели
- Коробка: Аллоцирует значение в куче. Box
- Rc/Arc: Счётчики ссылок. Reference counters
- Ref/RefMut + RefCell: Заимствование на уровне исполнения программы. Runtime borrowing
Другие типы
- Функции: Не относятся к текущей версии таксономии, поэтому приведены лишь постольку-поскольку.
- Замыкания: Closures
- FnOnce: Documentation
- FnMut: Documentation
- Fn: Documentation
- Объекты типажи: Trait Objects
- Фантомные типы: Phantom Data