
Замыкания в Rust могут работать в двух режимах: без ключевого слова
move
они захватывают значения по ссылке (разделяемой или уникальной — в зависимости от использования), а с ключевым словом move
они захватывают все значения по значению. Как правило, этого достаточно, но иногда требуется часть значений захватить по значению, а часть — по ссылке.В C++ у лямбда-функций есть отдельные списки захвата переменных, поэтому там эта задача решается достаточно просто. Синтаксис Rust не предлагает прямолинейного способа решения этой проблемы. Единственный вариант — это вручную ввести новые привязки к ссылкам на нужные значения и "передать" их в
move
-замыкание. Это вариант рабочий, но утомительный.К счастью, для сокращения бойлерплейта в Rust есть макросы! И есть библиотека, которая фактически привносит список захвата для лямбд: https://lib.rs/crates/closure