Функция может возвращать некоторый результат. Для подобной функции при ее определении необходимо указать тип возвращаемого значения с помощью оператора ->:
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()
указывает, что это выражение НЕ представляет возвращаемый результат.
Соответственно мы столкнемся с ошибкой:
Другой пример возможной ошибочной ситуации при возвращении результата - возвращение значения неправильного типа. Например:
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, поэтому мы опять же столкнемся с ошибкой:
При этом функция может содержать и другие инструкции, только в отличие от выражения возвращения результата они должны заканчивться точкой с запятой. Например, напишем функцию проверки корректности возраста:
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 возвращаемое_значение;
Например:
fn main(){ let num1 = sum(2, 3); // 5 println!("num1={}", num1); } fn sum(a: i32, b: i32) -> i32 { return a + b; // возвращение значение }