Перейти к основному содержанию

1. Функции (Function)

К текущему уроку мы изучили базовый синтаксис языка программирования Rust, узнали о типах данных, научились придумывать алгоритмы решения учебных задач и писать короткие программы реализующие эти алгоритмы. Далее наши программы будут усложняться, поэтому мы начнем изучать возможности по декомпозиции программного кода на небольшие части, которые программист сможет понимать и дорабатывать.

Функция (function) - это логически обособленный блок кода, позволяющий выполнять какую-либо специализированную задачу. Функция определяется отдельно от основного кода программы и может вызываться несколько раз. Это позволяет делать программу короче и облегчает её чтение (если не злоупотреблять количеством функций).

Функция без параметров

Например, мы выделили в отдельную функцию печать декоративной разделительной линии:

fn main() {
    print_div_line();
    println!("Здравствуй, пользователь!");
    print_div_line();
}

fn print_div_line() {
    println!("-----------***-----------");
}
Результат: -----------***-----------
Здравствуй, пользователь!
-----------***-----------

В нижней части листинга программы мы определили функцию print_div_line(), а в теле основной функции main мы её вызываем два раза.

Использовании функции позволяет нам сконцентрироваться на основной логике коде, а вспомогательные части убрать из анализа. К тому же, внеся изменение в одном месте программы, это изменение применится везде, где использовалась эта часть кода. Попробуйте.

Следует понимать, что такие подпрограммы могут быть довольно объемными, что составит бОльший выигрыш по коду, нежели в данном примере.

Функция с параметрами

Если вы заметили, после имени функции идут круглые скобки. В них в функцию можно передавать какие-либо аргументы. Например:

fn main() {
    let username: &str = "Вячеслав";
    greeting(username);
}

fn greeting(name: &str) {
    println!("Здравствуй, {}!", name);
}
Результат: Здравствуй, Вячеслав!

Здесь в функцию greeting() мы передаем в качестве аргумента имя пользователя, и она осуществляет вывод в консоль приветствие уже с именем этого пользователя.

При объявлении функции, обязательно указываем тип для параметров функции

Общий синтаксис объявления и использования функции

fn main() {
	fn function_name(variables: datatype) {
		expressions;
	}
	fn main() {
		expressions;
		function_name(variables);	// Аргументы функции
		expressions;
	}
}

Функция может быть объявлена в любом месте, как внутри основной функции main, так и до нее или после. При вызове функции мы передаем в неё значения переменных - аргументы. А функция при исполнении принимает эти переменные (либо ссылки - это изучим позже), внутри функции они называются параметры.

Функция с возвратом значения

Ранее мы рассмотрели функцию как независимого исполнителя каких-то действий. Однако, часто функция выполняет какие-то вычисления и возвращает результат вызвавшему её потоку кода.

Общий синтаксис объявления функции с возвратом значения

fn function_name(variables) -> datatype {	
	expressions;
	return value    // Возвращает значение
}

После названия функции, используя знак ->, указывается тип возвращаемого значения. Оператор return возвращает из функции значение.

А вот практический пример:
fn main() {
    let n1: i32 = 14;
    let n2: i32 = 9;
    println!("Произведение {} и {} равно {}", n1, n2, multiply(n1, n2));
}

fn multiply(num1: i32, num2: i32) -> i32 {
    num1 * num2
}
Результат: Произведение 14 и 9 равно 126

Обратите внимание на отсутствие точки с запятой при возврате значения. При этом слово return можно не писать.

Как правильно называть функции

В Rust имя функции пишется строчными буквами с разделением символом подчеркивания. (snake_case). Её наименование должно как-то указывать на то, что она делает. Стремитесь писать код так, чтобы он читался, как простой текст на английском языке. Слишком короткие имена будут непонятны, слишком длинные избыточно сложны.

Чтобы понять хорошо-ли вы называете свои функции и переменные, пробуйте возвращаться к старому коду через несколько недель – вы будете несколько удивлены.

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

Для просмотра заданий и решений, а также публикации своих решений необходимо зарегистрироваться на сайте.

Всё бесплатно, мы просто хотим с вами познакомиться и понять насколько актуально то, что мы делаем.

© Клют И. А., 2022. Копирование контента возможно только с письменного разрешения автора.