Этот вопрос позволяет разобраться, как замыкания работают с захваченными данными, и различия между их типами.
В Rust существуют три типа замыканий: Fn, FnOnce и FnMut. Они отличаются тем, как обрабатывают захваченные данные: Fn работает с неизменяемыми ссылками, FnMut — с изменяемыми, а FnOnce — с перемещением.
Замыкания в Rust — это анонимные функции, которые могут захватывать переменные из своего окружения. Тип замыкания зависит от способа работы с захваченными данными.
Типы замыканий:
Fn: Захватывает данные по неизменяемой ссылке. Может вызываться несколько раз.
FnMut: Захватывает данные по изменяемой ссылке. Может изменять их.
FnOnce: Захватывает данные по перемещению (move). Может быть вызвано только один раз.
Примеры:
let hello = "Hello".to_string();
// Fn
let print = || println!("{}", hello);
print();
// FnMut
let mut count = 0;
let mut increment = || count += 1;
increment();
println!("{}", count);
// FnOnce
let consume = || println!("{}", hello);
consume(); // После вызова переменная hello недоступнаКогда использовать:
Fn — для неизменяемых операций.
FnMut — для изменяемых данных.
FnOnce — когда данные нужно полностью передать замыканию.
Замыкания делают код компактным и выразительным, а их строгая типизация предотвращает неожиданные изменения данных.