Байтовые представления общих типов.
Базовые типы
Основные типы встроены в ядро языка.
Безнаковые типы
Типы со знаком
Типы с плавающей точкой
Представление битовой выборки для f32:
Разъяснение:
Преобразование типа через as
Арифметические подводные камни
Выражение _100 означает все, что может содержать значение 100, например, 100_i32, но является непрозрачным для компилятора.
Текстовые типы
Базовые:
Применение:
Кодирование
Пользовательские типы
Основные типы, определяемые пользователем. Актуальное представление объекта.
Следует также отметить, что два типа A(X, Y) и B(X, Y) с точно такими же полями, могут иметь различную структуру; transmute() не гарантирует расположение.
Ссылки и указатели
Ссылки обеспечивают безопасный доступ к памяти, необработанные указатели это небезопасный доступ. Соответствующие мутабельные типы имеют идентичное расположение данных.
Должна быть задана допустимая величина 'T', и любая такая переменная должна существовать по крайней мере 'а.
Метаданные указателя
Многие типы ссылок и указателей могут содержать дополнительное поле, метаданные указателей. Это может быть длина элемента или информация о объекте или указатель на таблицу vtable. Указатели с метаданными называются жирными, иначе тонкими.
Нет метаданных. (указатель тонкий).
Если T является структурой, такой как S {x: [u8]} метаданные поля len является числом. размер контента.
Регулярная ссылка среза (т.е. ссылочный тип среза [T]) часто рассматривается как &[T].
Ссылка на строковый фрагмент (т. е. ссылочный тип строкового типа str), причем метаданные len является длиной среза.
Метаданные указывают на таблицу vtable, где Drop::drop(), Trait::f(), ... являются указателями на их соответствующий impl для Т.
Замыкания
Функции с автоматически управляемым захватом блоков данных. Например, если у вас:
Немного упрощенная функция, это замыкание, является удобной для записи «мини-функцией», которая принимает параметры, но также имеет некоторые локальные переменные для выполнения своей работы. Этот тип (содержит нужные локальные переменные) в функции. «Захват переменных» - это модный способ сказать, что замыкание удерживает локальные переменные, либо по перемещенному значению, либо по указателю.
Генерируемые анонимные замыкания типов C1 и C2, переданные в with_closure(), будут выглядеть следующим образом:
Также создает анонимные функции, такие как f$_c$$_1$ (C1, X) или f$_c$$_2$ (& C2, X). Подробности зависят от того, какие FnOnce, FnMut, Fn... поддерживается на основе свойств используемых типов.
Типы переменных стандартной библиотеки
Стандартная библиотека rust объединяет вышеперечисленные примитивные типы c другими типами с особой семантикой, например:
Волшебный тип, допускающий совмещенную мутабельность.
Позволяет T's перемещаться внутрь и наружу.
Также поддерживают динамическое заимствование T. Cell работает с Send, но не с Sync.
Запрещает T::drop() быть вызванным.
Этот тип аналогично.
Тег может быть опущен для определенных T, например NonNull.
Либо некоторая ошибка E, либо значение T.
Неинициализированная память или некоторые Т. Это легальный способ работы с неинициализированными данными.
Хранение коллекций
Для некоторых T стек-прокси может нести метаданные (например, Box<[T]>).
Вектор массива значений одного типа.
Элементы head и tail имеют значение null или указывают на узлы на куче. Каждый узел может указывать на свой предыдущий и следующий узел.
Заголовок индекса выбирает массив в качестве кольцевого буфера. Это означает, что содержимое может быть несмежным и пустым посередине, как показано выше.
Другие коллекции
Сохраняет ключи и значения в куче в соответствии с хеш-значением. HashSet идентичен HashMap, просто типа V нет. Представление кучи значительно упрощено.
В куче сохранен массив с 2N элементами на слой. Каждый Т может иметь 2 нижестоящих элемента в слое ниже. Каждый Т выше своего
ребенка.
Другие строки
Обратите внимание, чем строка отличается от &str и &[char].
NUL-окончание, но без NUL в середине.
Инкапсулирует, как работает операционная система представляя строки (например, WTF-8 в Windows).
Инкапсулирует, как работает операционная система представляя пути.
Совместное владение
Если тип не содержит Cell for T, то это часто комбинируется с одним из типов Cell (тип для примера), чтобы обеспечить общую фактическую мутабельность.
Совместное владение T в одном потоке. Для разрешения мутации требуется вложенное значение или ссылка на него. Это не передача и не синхронизация.
То же самое, но разрешить совместное использование между потоками, если они содержат T, это передача или синхронизация.
Внутренние поля зависят от платформы. Должны удерживается в Arc для разделения между разъединенными потоками, или через scope() для потоков с областью действия.
Статья на list-site.