Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗rsPmClFT 283 of 373 menu
◀ ▶

Тип функции и замыкание в 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).

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить