BorrowCheck › Ядро языка Rust

Преобразования типов

From / Into, TryFrom, приведения as, deref-приведение, AsRef / Borrow, transmute.

Тема объясняет преобразования типов: явные через трейты From, Into, TryFrom и оператор as, неявные через приведение (coercion) и небезопасные через transmute. Вопросы проверяют, почему реализация From даёт Into, но не наоборот, когда компилятору не хватает целевого типа для into() и как правило сирот (orphan rule) запрещает From между чужими типами. Раздел о приведениях as разбирает усечение и расширение знака целых, насыщение при переводе числа с плавающей точкой в целое, потерю точности u64 в f64 и то, какие типы в char не приводятся. Отдельно рассматривается deref-приведение (deref coercion): цепочки через Deref, места приведения, почему приведение не срабатывает для параметра с границей трейта и почему &Vec<String> не становится &[&str]. Раздел об AsRef, Borrow и ToOwned объясняет, почему HashMap<String, _> ищется по &str, какой тип хранит Cow::Owned и почему clone() на &str не даёт String. Последний раздел посвящён transmute: проверка размеров, порядок байтов, неограниченное время жизни (unbounded lifetime) и неопределённое поведение (undefined behavior) при превращении &T в &mut T.

38 вопросов: базовый уровень — 16, средний — 20, углублённый — 2. 5 справок, 31 источник.

Разделы

  1. From / Into, TryFrom / TryInto
  2. Приведения as
  3. Deref-приведение
  4. AsRef, Borrow, ToOwned
  5. transmute и его опасности

Предыдущая тема: Замыкания · Следующая тема: Обработка ошибок