РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
74 of 1245 menu

Тип функции

Тип функции fn в Rust описывает указатель на функцию с заданной сигнатурой: набором типов параметров и типом возвращаемого значения. Переменная такого типа хранит адрес функции и может быть вызвана так же, как обычная функция. Тип функции записывается с помощью ключевого слова fn, за которым в скобках перечисляются типы параметров, а после стрелки -> указывается тип возвращаемого значения.

Тип функции является Copy, Clone, Send и Sync, а его размер всегда равен размеру указателя. В отличие от замыканий, тип функции не захватывает окружение.

Синтаксис

fn(тип_параметра1, тип_параметра2) -> тип_возврата

Пример

Давайте объявим переменную с типом функции, принимающей два числа i32 и возвращающей их сумму:

fn add(a: i32, b: i32) -> i32 { a + b } fn main() { let f: fn(i32, i32) -> i32 = add; let res = f(2, 3); println!("{}", res); }

Результат выполнения кода:

5

Пример

Тип функции можно передавать в качестве параметра в другую функцию. Давайте передадим функцию умножения и применим её к двум числам:

fn multiply(a: i32, b: i32) -> i32 { a * b } fn apply(f: fn(i32, i32) -> i32, a: i32, b: i32) -> i32 { f(a, b) } fn main() { let res = apply(multiply, 4, 5); println!("{}", res); }

Результат выполнения кода:

20

Пример

Тип функции можно хранить в массиве и выбирать нужную функцию по индексу. Давайте создадим массив из двух функций и вызовем первую из них:

fn add(a: i32, b: i32) -> i32 { a + b } fn sub(a: i32, b: i32) -> i32 { a - b } fn main() { let ops: [fn(i32, i32) -> i32; 2] = [add, sub]; let res = ops[0](10, 3); println!("{}", res); }

Результат выполнения кода:

13

Пример

Функция может возвращать другую функцию с помощью типа fn. Давайте вернём функцию сложения и вызовем её:

fn add(a: i32, b: i32) -> i32 { a + b } fn get_op() -> fn(i32, i32) -> i32 { add } fn main() { let f = get_op(); let res = f(7, 8); println!("{}", res); }

Результат выполнения кода:

15

Смотрите также

  • тип impl Trait,
    который позволяет возвращать замыкания и функции без указания конкретного типа
  • тип dyn,
    который используется для динамической диспетчеризации трейт-объектов
  • тип unit,
    который представляет пустой кортеж и часто является типом возврата функций
  • тип never,
    который обозначает функции, никогда не возвращающие управление
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить