В 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
}