Тип функции
Тип функции 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,
который обозначает функции, никогда не возвращающие управление