Функции в Rust

Функции повсеместны в языке Rust.

Из предыдущих глав мы уже узнали базовую форму функций Rust:

fn <函数名> ( <参数> ) <函数体>

Стиль именования функций Rust — строчные буквы, разделённые подчёркиваниями:

Пример

fn main() {
    println!("Hello, world!");
    another_function();
}

fn another_function() {
    println!("Hello, example!");
}

Вывод:

Hello, world!
Hello, example!

Обратите внимание, что мы определили another_function после функции main в исходном коде. Rust не важно, где вы определяете функции, просто нужно определить их где-нибудь.

Параметры функции

В Rust, если функции нужны параметры, вы должны объявить имена и типы параметров:

Пример

fn main() {
    another_function(5, 6);
}

fn another_function(x: i32, y: i32) {
    println!("Значение x: {}", x);
    println!("The value of y is: {}", y);
}

Вывод:

x 的值为 : 5
y 的值为 : 6

Операторы и выражения в телах функций

Тела функций в Rust состоят из последовательности операторов (Statements), которые могут заканчиваться выражением (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!("The value of y is: {}", 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ключевое слово.

Другие расширения