% Трансмутации
Уберись с нашей дороги, система типов! Мы будем интерпретировать эти биты по- своему или умрем пытаясь! Хотя эта книга и про создание небезопасных вещей, я действительно не могу не подчеркнуть, что вы должны глубоко задуматься над поиском Другого способа, кроме того, что рассматривается в этом разделе. Это действительно, по-настоящему, самая ужасно небезопасная вещь, которую вы можете сделать в Rust. Это как если бы железнодорожное полотно охраняла зубная нить.
mem::transmute<T, U> берет значение типа T и интерпретирует его, как тип U.
Единственное ограничение - размер T и U должен совпадать. Варианты, которые
вызывают Неопределенное Поведение этим, сводят с ума.
- Первое и самое главное, создание экземпляра любого типа с неправильным состоянием вызовет огромный хаос, который невозможно будет предсказать.
- Трансмутация имеет перегруженный тип возврата. Если вы не укажете тип возврата она создаст какой-то неизвестный тип, удовлетворяющий выводу типов.
- Создание примитива с неправильным значением - это неопределённое поведение (НП)
- Трансмутации между non-repr(C) типами - это НП
- Трансмутации & в &mut - это НП
- Трансмутации & в &mut - это всегда НП!
- Нет, ты не можешь так делать!
- Нет, ты не особенный!
- Трансмутации в ссылку без явного указания времени жизни создает unbounded-lifetimes
mem::transmute_copy<T, U> каким-то образом стал даже более дико небезопасным
чем это. Он копирует size_of<U> байтов из &T и интерпретирует их как U.
Проверка длины, которая была у mem::transmute пропала (потому что копировать
префикс может оказаться допустимым), хотя если U длиннее, чем T - это
Неопределенное Поведение.
Вы можете получить большую часть этой функциональности, используя явное приведение указателей.