В Rust функция может представлять отдельный тип данных. И в реальности мы даже можем определять переменные с типом функции и присваивать им конкретные функции, также как и анонимные. Что представляет тип функции? Тип функции состоит из типов параметров и типа возвращаемого результата функции.
fn(тип_параметра1, тип_параметра2 ... тип_параметраN) -> тип_результата
Например, возьмем следующую функцию:
fn message(){ println!("hello"); }
Эта функция не имеет никаких параметров и ничего не возвращает. Тип такой функции можно описать как fn() - после ключевого
слова fn
в скобках указываются типы параметров. Но в данном случае функция не имеет параметров, поэтому скобки пустые.
Допустим, у нас есть следующая анонимная функция:
fn main(){ let display = ||{println!("hello");}; display(); }
Анонимная функция, которая представлена переменной display
, в реальности имеет тип fn(). То ест мы можем написать:
fn main(){ let display: fn() = ||{println!("hello");}; display(); }
Или так:
fn main(){ let display: fn() = message; display(); } fn message(){ println!("hello Rust"); }
Но, допустим, функция принимает параметры:
fn message(text:&str){ println!("{}", text); }
Типом такой функции является fn(&str) - в скобках указывется тип параметра. То есть мы можем написать так:
fn main(){ let display: fn(&str) = message; display("Hello Rust!"); } fn message(text:&str){ println!("{}", text); }
Теперь рассмотрим пример, когда функция возвращает результат:
fn multiply(a: i32, b: i32) -> i32{ a * b }
Функция принимает два параметра типа i32
и возврашает объект типа i32
. Тип результата также включается в тип функции. Поэтому
типом данной функции будет fn(i32, i32) -> i32. То есть мы можем написать так:
fn main(){ let operation: fn(i32, i32) -> i32 = multiply; let result = operation(5, 6); println!("Result: {}", result); // Result: 30 } fn multiply(a: i32, b: i32) -> i32{ a * b }