Замыкания или closures в Rust представляют анонимные функции, которые могут запоминать свое окружение. По сути любая анонимная функция может запоминать свое окружение и поэтому является замыканием.
Когда замыкание получает значение из своего окружения, оно сохраняется в памяти для дальнейшего использования в теле замыкания. Рассмотрим простейший пример:
fn main(){
let message = "Hello Rust"; // переменная - внешнее окружение замыкания
let hello =||{ // определение замыкания
println!("{}", message);
};
hello(); // вызов замыкания
}
В данном случае переменная message представляет часть лексического окружения, которое доступно замыканию.
let message = "Hello Rust"; // переменная - внешнее окружение замыкания
Далее определяется замыкание hello, которое может обращаться к этому окружению:
let hello =||{ // определение замыкания
println!("{}", message);
};
Затем мы можем вызвать замыкание, которое использует переменную из внешнего окружения:
hello(); // вызов замыкания
В итоге на консоль будет выведена строка "Hello Rust".
Если замыкание должно изменять значение внешней переменной, то и эта внешняя переменная и переменная-замыкание должны быть определены со ключевым словом mut:
fn main(){
let mut n = 5;
let mut increase =||{
n = n + 1;
println!("n = {}", n);
};
increase();
increase();
increase();
println!("Переменная n в функции main равна {}", n);
}
Здесь замыкание increase() увеличивает значение переменной n. Соответственно и переменная n, и переменная increase
определены как изменяемые.
Консольный вывод:
n = 6 n = 7 n = 8 Переменная n в функции main равна 8