Много вызовов замыкания в Rust
Замыкание, которое не меняет захват, можно передать в функцию и вызвать снова. Параметр ограничивают трейтом, который допускает многократное обращение к одному и тому же замыканию.
Запишем функцию, которая принимает такое замыкание и число:
fn apply(f: impl Fn(i32) -> i32, n: i32) -> i32 {
f(n)
}
fn main() {
let add_one = |x| x + 1;
let a = apply(add_one, 3);
let b = apply(add_one, 7);
println!("{} {}", a, b);
}
Замыкание add_one не захватывает
имена снаружи, поэтому его спокойно передают
в apply дважды. Функция apply
не знает тело замыкания: ей достаточно,
что параметр подходит под трейт с повторными
вызовами.
Тот же трейт подходит, когда захват копируется и замыкание только читает копию:
fn apply(f: impl Fn(i32) -> i32, n: i32) -> i32 {
f(n)
}
fn main() {
let base = 10;
let add_base = |x| x + base;
let first = apply(add_base, 2);
let second = apply(add_base, 5);
println!("{} {}", first, second);
}
Дано число:
let start: i32 = 4;
Запишите замыкание, которое прибавляет
start к аргументу, передайте его
в функцию с двумя параметрами из урока
и выведите два разных результата.
Дано число:
let n: i32 = 9;
Сделайте замыкание, которое удваивает
аргумент, дважды передайте его в общую
функцию с числом n и выведите
оба ответа.
Скажите, почему одно и то же замыкание из первого примера можно передать в функцию два раза подряд.