Тип функции

Последнее обновление: 05.05.2021

В 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
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850