Замыкания

Последнее обновление: 20.04.2021

Замыкания или 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
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850