English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Функции в языке Rust встречаются повсюду.
Через предыдущие главы вы уже можете узнать основную форму функции Rust:
fn <имя_функции> ( <параметр> ) <тело_функции>
Имя функции Rust стилизуется с использованием нижних символов и разделенных подстрочными знаками:
fn main() { println!("Привет, мир!"); another_function(); } fn another_function() { println!("Привет, w3codebox!"); }
Результат выполнения:
Привет, мир! Привет, w3codebox!
Обратите внимание, что мы определили another_function после функции main в исходном коде. Rust не cares, где вы определяете функции, просто определите их где-то.
В Rust функция, которая требует параметров, должна声明 имена и типы параметров:
fn main() { another_function(5, 6); } fn another_function(x: i32, y: i32) { println!("Значение x: {}", x); println!("Значение y: {}", y); }
Результат выполнения:
Значение x: 5 Значение y равно: 6
Тело функции Rust состоит из серии предложений (Statement), которые могут заканчиваться выражением (Expression). До сих пор мы видели функции, не заканчивающиеся выражением, но уже использовали выражения как часть предложения.
Строки выполняют某些 действия и не возвращают значение. Например:
let a = 6;
Этот шаг не возвращает значение, поэтому следующая команда не правильна:
let a = (let b = 2);
Выражение имеет шаги вычисления и возвращает значение. Вот пример выражения (предполагается, что все используемые идентификаторы уже определены):
a = 7 b + 2 c * (a + b)
В Rust можно написать более сложное выражение в блоке, заключенном в {}:
fn main() { let x = 5; let y = { let x = 3; x + 1 }; println!("Значение x: {}", x); println!("Значение y: {}", y); }
Результат выполнения:
Значение x: 5 Значение y: 4
Очевидно, что в этом фрагменте программы содержится выражение блока:
{ let x = 3; x + 1 };
И в блоке можно использовать выражения функций, последним шагом является выражение, результатом которого является значение всего выражения блока. Это выражение блока называется выражением тела функции.
Внимание: после x + 1 не должно быть точек с запятой,否则 это будет одно выражение!
Это выражение блока является законным телом функции. В Rust функция может быть вложенной:
fn main() { fn five() -> i32 { 5 } println!("Значение five(): {}", five()); }
В предыдущем примере уже было показано, как указывать тип возвращаемого значения функции в Rust: после объявления параметров используется -> для указания типа возвращаемого значения функции (не : ).
В теле функции в любое время можно завершить выполнение функции с помощью ключевого слова return и вернуть подходящее значение. Это наиболее близко к опыту большинства разработчиков:
fn add(a: i32, b: i32) -> i32 { return a + b; }
Но Rust не поддерживает автоматическое определение типа возвращаемого значения! Если тип возвращаемого значения функции не明确 указан, функция считается "чистым процессом", который не может возвращать значение, после return не может следовать выражение значения. Таким образом, делается попытка сделать публичные функции видимыми.
Внимание:Выражение тела функции не эквивалентно телу функции, оно не может использовать return Ключевые слова.