Функции и выражения

RustBeginner
Практиковаться сейчас

Введение

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

В этой лабораторной работе подготовленный проект Cargo уже содержит три функции преобразования и все их вызовы. На каждом шаге вы замените одно выражение-заполнитель. Благодаря этому объём ввода остаётся небольшим, а вы увидите, как связаны определения функций, параметры, возвращаемые типы, выражения и вызовы.

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

На этом шаге вы завершите функцию, которая преобразует минуты в секунды, и свяжете её определение с вызовом.

Перейдите в подготовленный проект и откройте исходный файл:

cd /home/labex/project/conversion-tool
nano src/main.rs

В начале файла следующая строка начинает определение функции:

fn minutes_to_seconds(minutes: i32) -> i32 {
  • fn обозначает функцию.
  • minutes_to_seconds — имя функции.
  • minutes: i32 — параметр: входное значение с именем minutes типа i32.
  • -> i32 указывает, что функция возвращает значение типа i32.
  • Фигурные скобки содержат тело функции.

Rust проверяет каждый вызов в соответствии с этой сигнатурой. Вызывающая сторона должна передать ожидаемое количество аргументов в объявленном порядке, причём тип каждого аргумента должен быть совместим с соответствующим параметром.

Замените только 0 перед комментарием Step 1 на:

    minutes * 60 // Step 1: replace this placeholder expression.

Обратите внимание: после minutes * 60 нет точки с запятой. Это последнее выражение в теле функции, поэтому его значение становится возвращаемым значением функции. Если добавить точку с запятой, выражение превратится в инструкцию, которая не возвращает это значение.

Сохраните файл с помощью Ctrl+O, нажмите Enter и выйдите с помощью Ctrl+X. Проверьте код:

cargo check

В main выражение minutes_to_seconds(5) является вызовом функции. Значение 5 — это аргумент, переданный параметру minutes. Запустите программу:

cargo run --quiet

Теперь её первая строка должна выглядеть так:

5 minutes = 300 seconds

Использование параметра и возвращаемого типа с десятичными значениями

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

Откройте исходный файл:

nano src/main.rs

Найдите celsius_to_fahrenheit. И параметр, и возвращаемый тип этой функции — f64, поэтому вычисление может сохранять дробный результат. Временное выражение celsius * 0.0 использует параметр, но намеренно возвращает ноль. Замените это выражение целиком на:

    celsius * 9.0 / 5.0 + 32.0 // Step 2: replace this placeholder expression.

Это ещё один случай возврата значения через выражение: вычисленное значение находится последним элементом тела функции и не завершается точкой с запятой. Умножение и деление выполняются перед сложением в соответствии с обычным приоритетом арифметических операций. Скобки позволяют явно указать более сложный требуемый порядок вычислений. Вызывающей стороне не нужно знать формулу: она передаёт значение температуры в градусах Цельсия и получает возвращённое значение в градусах Фаренгейта.

Сохраните файл, выйдите из редактора и запустите программу:

cargo run --quiet

Вторая строка должна выглядеть так:

20.0 C = 68.0 F

Вызов celsius_to_fahrenheit(20.0) передаёт один аргумент. Возвращённое значение сохраняется в привязке fahrenheit, после чего форматируется для вывода.

Повторное использование функции с несколькими аргументами

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

Подготовленная функция scale_amount получает параметры amount и factor. Параметры разделяются запятыми, и у каждого параметра есть собственный тип. Вызов должен передавать аргументы в том же порядке.

Откройте файл и найдите заполнитель Step 3:

nano src/main.rs

Временное выражение amount * factor * 0.0 намеренно возвращает ноль. Замените это выражение целиком на:

    amount * factor // Step 3: replace this placeholder expression.

Сохраните файл и выйдите из редактора, затем выполните итоговую проверку:

cargo check

Запустите завершённую программу:

cargo run --quiet

Одна и та же функция вызывается один раз для муки и один раз для воды. Последние две строки должны выглядеть так:

Scaled flour: 375.0 g
Scaled water: 270.0 ml

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

Итоги

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