Умные указатели, внутренняя изменяемость
Box, Rc / Arc, RefCell / Cell, Weak и циклы, Cow, трейт Deref.
Тема объясняет умные указатели (smart pointers) стандартной библиотеки и внутреннюю изменяемость (interior mutability). Раздел о Box показывает, когда значение кладут в кучу: рекурсивный тип без косвенности (E0072), значения без известного размера и объекты-трейты, размер самого Box и Option<Box<T>>, а также Box::leak. Вопросы о Rc и Arc проверяют подсчёт ссылок, разницу между клонированием указателя и значения, сравнение через == и Rc::ptr_eq, извлечение значения через Rc::try_unwrap, Rc::into_inner и Rc::make_mut и то, почему Rc нельзя передать в другой поток. Разделы о Cell, RefCell и OnceCell разбирают изменение через &self и паники при конфликте заимствований во время выполнения, в том числе когда временное охранное значение живёт до конца оператора или выражения match; раздел о Weak — сильный и слабый счётчики и циклы ссылок, из-за которых возникает утечка. Последние разделы посвящены Cow с копированием при записи (to_mut, into_owned) и трейту Deref: почему deref возвращает ссылку, почему DerefMut требует Deref и когда реализация Deref для собственного типа уместна. Тема опирается на владение и заимствование и подготавливает к многопоточности.
46 вопросов: базовый уровень — 20, средний — 22, углублённый — 4. 6 справок, 21 источник.
Разделы
Box<T>RcиArcRefCell,Cell, внутренняя изменяемостьWeakи циклы ссылокCow<'a, T>- Трейт
Deref
Предыдущая тема: Модули, Cargo, фичи, редакции · Следующая тема: Drop, RAII, порядок уничтожения