Параметр-замыкание в Rust
Функция может принимать замыкание через ограничение трейтом и вызывать его внутри. Снаружи видна одна сигнатура, а конкретное тело замыкания подставляют на месте вызова функции.
Удвоим число через параметр-замыкание:
fn apply(f: impl Fn(i32) -> i32, n: i32) -> i32 {
f(n)
}
fn main() {
let double = |x| x * 2;
let value = apply(double, 6);
println!("{}", value);
}
Параметр f описан через impl Fn(i32) -> i32:
функция ждет любое замыкание с таким
видом аргумента и результата. Внутри apply
замыкание применяют к числу n, не
зная, удвоение это или другое правило.
Тот же параметр подходит для замыкания без захвата и для чтения захваченного числа:
fn apply(f: impl Fn(i32) -> i32, n: i32) -> i32 {
f(n)
}
fn main() {
let shift = 3;
let add_shift = |x| x + shift;
let value = apply(add_shift, 10);
println!("{}", value);
}
Дано число:
let n: i32 = 8;
Запишите замыкание, которое вычитает
единицу из аргумента, передайте его
в общую функцию с n и выведите
результат.
Дано число:
let base: i32 = 5;
Сделайте замыкание, которое прибавляет
base к аргументу, и функцию с
двумя параметрами из урока. Выведите
ответ для числа 2.
Скажите, что дает запись параметра через ограничение трейтом замыкания вместо отдельной функции на каждый случай.