Возвращение значения из функции

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

Функция может возвращать некоторый результат. Для подобной функции при ее определении необходимо указать тип возвращаемого значения с помощью оператора ->:

fn имя_функции(параметры) -> тип_возвращаемого_значения
{
}

Тип возвращаемого значения указывается после стрелки -> после списка параметров.

Например, определим функцию, которая возвращает сумму двух чисел:

fn main(){
	
	let num1 = sum(2, 3);	// 5
	let num2 = sum(5, 6);	// 11
	println!("num1={}  num2={}", num1, num2);
}
fn sum(a: i32, b: i32) -> i32	// установка типа возвращаемого значения
{
	a + b		// возвращение значения
}

Здесь функция sum() принимает два числа (а точнее два значения типа i32). Кроме того, она возвращает значение типа i32 (-> i32).

Возвращение значения выглядит довольно просто - результат сложения двух чисел:

a + b

Обратите внимание, что, во-первых, для возвращения значения не используется никаких дополнительных операторов, как например, оператор return в некоторых языках программирования. Во-вторых, после возвращаемого значения не ставится точка с запятой.

Поскольку функция sum() возвращает значение - число типа i32, то мы можем присвоить это значение переменной:

let num1 = sum(2, 3);	// 5

Исходя из присваиваемого значения Rust установит для переменной num1 тип i32.

Важно, что если мы указали для функции тип возвращаемого результата, то функция обязательно должна возвращат некоторое значение. Например, чуть изменим предыдущий пример:

fn main(){
	
	let num1 = sum(2, 3);		// ! Ошибка
	println!("num1={}", num1);
}
fn sum(a: i32, b: i32) -> i32
{
	a + b;
}

Точка с запятой после a + b в функции sum() указывает, что это выражение НЕ представляет возвращаемый результат. Соответственно мы столкнемся с ошибкой:

Возвращение результата из функции в Rust

Другой пример возможной ошибочной ситуации при возвращении результата - возвращение значения неправильного типа. Например:

fn main(){
	
	let num1 = sum(2, 3);		// ! Ошибка
	println!("num1={}", num1);
}
fn sum(a: i32, b: i32) -> u32
{
	a + b
}

В данном случае для функции sum() в качестве типа возвращаемого значения определен тип u32. Но при сложении двух значений типа i32 образуется значение того же типа i32. То есть появляется несовместимость типов - u32 и i32, поэтому мы опять же столкнемся с ошибкой:

Возвращение из функции в Rust

При этом функция может содержать и другие инструкции, только в отличие от выражения возвращения результата они должны заканчивться точкой с запятой. Например, напишем функцию проверки корректности возраста:

fn main(){
	
	let result1 = check_age(18);
	println!("result1={}", result1);
	
	let result2 = check_age(127);
	println!("result2={}", result2);
}
fn check_age(age: u8) -> bool
{
	println!("В функцию chek_age передано значение: {}", age);
	age <= 110
}

Функция check_age() в качестве параметра принимает некоторый возраст. Тип возвращаемого значения - bool, то есть, если возраст прошел проверку, возвращается true, если не прошел - то false.

Условимся, что возраст больше 110 является недействительным. Поэтому возвращение значения выглядит следующим образом:

age <= 110

Консольный вывод программы:

В функцию chek_age передано значение: 18
result1 = true
В функцию chek_age передано значение: 127
result2 = false

Теперь немного изменим пример, чтобы функция могла возвращать два разных значения:

fn main(){
	
	let age1 = set_age(18);
	println!("age1={}", age1);
	
	let age2 = set_age(127);
	println!("age2={}", age2);
}
fn set_age(age: u8) -> u8
{
	println!("В функцию set_age передано значение: {}", age);
	if age <= 110{
		age
	}
	else{
		25
	}
}

Функция set_age() опять же в качестве параметра принимает некоторый возраст и, если он является недействительным (больше 110), то устанавливает в качестве возраста некоторое значение по умолчанию - в данном случае число 25:

else{
		25
	}

Если возраст прошел проверку, то просто возвращается значение параметра:

if age <= 110{
		age
	}

Важно отметить, что вне зависимости какое значение возвращается, все они должны соответствовать возвращаемому типу функции - в данном случае типу u8.

Результат выполнения программы:

В функцию set_age передано значение: 18
age1 = 18
В функцию set_age передано значение: 127
age2 = 25

Оператор return

Оператор return представляет иной способ возвращения значения. В этом случае возвращаемое значение указывается после оператора return, а затем идет точка с запятой - как в ряде других языков программирования:

return возвращаемое_значение;

Например:

fn main(){
     
    let num1 = sum(2, 3);       // 5
    println!("num1={}", num1);
}
fn sum(a: i32, b: i32) -> i32
{
    return a + b;	// возвращение значение
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850