Тип функции и замыкание в Rust
Обычную функцию можно положить в переменную
с типом указателя на функцию. Запись выглядит
как fn, список типов параметров в скобках
и тип результата после стрелки.
Такой тип подходит, если тело ничего не забирает из окружения. И сама функция по имени, и замыкание только из параметров приводятся к одному указателю:
fn bump(n: i32) -> i32 {
n + 1
}
fn run(f: fn(i32) -> i32, x: i32) -> i32 {
f(x)
}
fn main() {
let from_fn: fn(i32) -> i32 = bump;
let from_closure: fn(i32) -> i32 = |n: i32| n * 2;
println!("{}", run(from_fn, 3));
println!("{}", run(from_closure, 4));
}
На экране числа 4 и 8. Если замыкание
читает переменную снаружи, указатель fn
для него уже не подходит. Ниже тот же указатель
передают в функцию, которая вызывает его дважды:
fn twice(f: fn(i32) -> i32, x: i32) -> i32 {
f(f(x))
}
fn main() {
let add_two: fn(i32) -> i32 = |n: i32| n + 2;
println!("{}", twice(add_two, 5));
}
Объявите halve с типом fn(i32) -> i32
как замыкание деления на 2 без захвата
и выведите результат применения к 8.
Дан следующий код:
fn main() {
let factor = 3;
let scale: fn(i32) -> i32 = |n: i32| n * factor;
}
Скажите, соберется ли программа.
Объявите функцию neg с одним i32,
положите ее в op с типом fn(i32) -> i32
и выведите op(7).