Замыкания
Режимы захвата, Fn / FnMut / FnOnce, ключевое слово move, замыкания как параметры, указатели на функции.
Тема объясняет замыкания (closures): как компилятор выбирает для каждой захваченной переменной режим захвата по тому, что с ней делает тело, и почему начиная с редакции 2021 замыкание захватывает отдельные поля, а не структуру целиком. Вопросы проверяют, какие из трейтов Fn, FnMut и FnOnce реализует замыкание, почему это определяет тело, а не ключевое слово move, и когда замыкание само оказывается Copy. Раздел о move разбирает, что именно переносится внутрь: владение строкой, копия значения на момент создания или сама ссылка, а также почему возвращаемому и сохраняемому в Box<dyn Fn> замыканию нужен move. Отдельно рассматриваются замыкания как параметры и результат функции: impl Fn в позиции аргумента и возврата, Box<dyn FnOnce>, вызов замыкания из поля структуры и граница с for<'a> для аргумента-ссылки. Последний раздел посвящён указателям на функции: чем тип функции (function item) отличается от fn, почему он имеет нулевой размер и почему захватывающее замыкание не приводится к fn.
39 вопросов: базовый уровень — 17, средний — 18, углублённый — 4. 5 справок, 23 источника.
Разделы
- Режимы захвата
Fn,FnMut,FnOnce- Ключевое слово
move - Замыкания как параметры и результат
- Указатели на функции
Предыдущая тема: Коллекции и итераторы · Следующая тема: Преобразования типов