Замыкания или 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