Изменение захвата замыканием в Rust
Если замыкание меняет свою переменную, параметр функции тоже должен быть изменяемым. Трейт для такого случая допускает изменение захвата при каждом обращении к замыканию.
Накопим сумму через замыкание и функцию с изменяемым параметром:
fn apply(mut f: impl FnMut(i32) -> i32, n: i32) -> i32 {
f(n)
}
fn main() {
let mut total = 0;
let mut add = |x| {
total += x;
total
};
let after = apply(add, 4);
println!("{}", after);
}
Имя total захвачено изменяемо, поэтому
замыкание add подходит под трейт с
изменением. Параметр f помечен как
mut, иначе тело функции не смогло бы
обратиться к замыканию, которое меняет состояние.
Функцию можно вызвать снова с тем же замыканием, и счетчик продолжит расти:
fn apply(mut f: impl FnMut(i32) -> i32, n: i32) -> i32 {
f(n)
}
fn main() {
let mut total = 0;
let mut add = |x| {
total += x;
total
};
let first = apply(add, 2);
let second = apply(add, 3);
println!("{} {}", first, second);
}
Дано число:
let mut count: i32 = 0;
Запишите замыкание, которое увеличивает
count на аргумент и возвращает
новое значение, передайте его в функцию
из урока и выведите результат.
Дано число:
let mut score: i32 = 5;
Сделайте замыкание, которое прибавляет
аргумент к score, дважды передайте
его в общую функцию и выведите оба
накопленных значения.
Скажите, зачем параметр замыкания в сигнатуре функции помечают как изменяемый.