Трейт Fn
Трейт Fn - это один из трех трейтов для вызываемых значений
в Rust, наряду с FnMut и FnOnce. Он описывает
замыкания и функции, которые можно вызывать многократно,
при этом они не изменяют захваченные переменные окружения
и не потребляют их. Параметром трейт принимает тип аргументов,
которые передаются при вызове, а возвращаемое значение
задается через ассоциированный тип Output.
Замыкания автоматически реализуют Fn, если они только
читают захваченные переменные.
Синтаксис
Fn(Args) -> Output
В качестве аргументов трейт принимает кортеж типов входа,
а возвращаемый тип задается через Output.
Использовать трейт можно в ограничениях обобщенных типов:
fn call_it<F: Fn(i32) -> i32>(f: F, x: i32) -> i32
{
f(x)
}
Пример
Давайте создадим замыкание, которое складывает два числа, и вызовем его несколько раз:
fn main()
{
let add = |a: i32, b: i32| a + b;
let res = add(2, 3);
println!("{}", res);
}
Результат выполнения кода:
5
Пример
Давайте передадим замыкание в функцию, которая принимает
обобщенный параметр с ограничением Fn:
fn apply<F: Fn(i32) -> i32>(f: F, x: i32) -> i32
{
f(x)
}
fn main()
{
let double = |x: i32| x * 2;
let res = apply(double, 5);
println!("{}", res);
}
Результат выполнения кода:
10
Смотрите также
-
трейт
FnMut,
который описывает замыкания, изменяющие захваченное окружение -
трейт
FnOnce,
который описывает замыкания, потребляющие захваченное окружение -
трейт
Trait Bound,
который задает ограничения на обобщенные типы -
трейт
dyn Trait,
который позволяет использовать трейты как динамические типы