Структуры как параметры функций
Часть раздела Logic & Flow путешествия по Rust на Coddy — урок 24 из 66.
Теперь, когда вы знаете, как создавать и изменять структуры (structs), давайте изучим, как использовать их с функциями. Как и любой другой тип данных в Rust, вы можете передавать экземпляры структур в функции и возвращать их из функций.
Чтобы передать структуру в функцию, вы просто указываете её в качестве параметра в определении функции:
fn calculate_area(rect: Rectangle) -> i32 {
rect.width * rect.height
}Эта функция принимает структуру Rectangle в качестве параметра и возвращает i32. Внутри функции вы можете обращаться к полям структуры, используя точечную нотацию, точно так же, как и в любом другом месте.
Вы также можете возвращать структуры из функций, указывая тип структуры в качестве возвращаемого типа:
fn create_square(size: i32) -> Rectangle {
Rectangle {
width: size,
height: size,
}
}Использование структур с функциями делает ваш код более организованным и осмысленным. Вместо передачи множества отдельных параметров вы можете сгруппировать связанные данные вместе и передать их как единую, четко определенную единицу.
Задание
ЛегкоВы получите четыре входных значения: ширину прямоугольника (целое число), высоту прямоугольника (целое число), длину стороны квадрата (целое число) и номер выбора (1 или 2). Определите структуру Rectangle с двумя полями: width: i32 и height: i32. Создайте две функции: одну, которая принимает Rectangle и вычисляет его площадь, и другую, которая принимает длину стороны и возвращает Rectangle, представляющий квадрат. В зависимости от введенного выбора, вычислите и выведите соответствующую площадь.
Требования:
- Определите структуру
Rectangleс полями:width: i32иheight: i32 - Создайте функцию
calculate_area, которая принимаетRectangleв качестве параметра и возвращаетi32(площадь) - Создайте функцию
create_square, которая принимаетi32(длину стороны) в качестве параметра и возвращаетRectangleс одинаковой шириной и высотой - Прочитайте первый ввод и преобразуйте его в
i32для ширины прямоугольника - Прочитайте второй ввод и преобразуйте его в
i32для высоты прямоугольника - Создайте экземпляр
Rectangleс этими размерами - Прочитайте третий ввод и преобразуйте его в
i32для длины стороны квадрата - Прочитайте четвертый ввод и преобразуйте его в
i32для выбора (1 или 2) - Если выбор равен 1: вычислите и выведите площадь прямоугольника
- Если выбор равен 2: создайте квадрат с помощью
create_square, затем вычислите и выведите его площадь
Ввод:
- Первая строка: Ширина прямоугольника как целое число (например,
8) - Вторая строка: Высота прямоугольника как целое число (например,
5) - Третья строка: Длина стороны квадрата как целое число (например,
6) - Четвертая строка: Выбор как целое число, либо 1, либо 2 (например,
1)
Вывод:
- Если выбор равен 1:
Rectangle area: [area] - Если выбор равен 2:
Square area: [area]
Шпаргалка
Структуры можно передавать в функции в качестве параметров и возвращать из функций.
Чтобы передать структуру в функцию, укажите её в качестве параметра:
fn calculate_area(rect: Rectangle) -> i32 {
rect.width * rect.height
}Чтобы вернуть структуру из функции, укажите тип структуры в качестве возвращаемого типа:
fn create_square(size: i32) -> Rectangle {
Rectangle {
width: size,
height: size,
}
}Внутри функций доступ к полям структуры осуществляется с помощью точечной нотации. Использование структур с функциями позволяет группировать связанные данные вместе вместо передачи нескольких отдельных параметров.
Попробуйте сами
use std::io;
// TODO: Определите структуру Rectangle здесь
// TODO: Определите функцию calculate_area здесь
// TODO: Определите функцию create_square здесь
fn main() {
// Чтение ширины прямоугольника
let mut width_input = String::new();
io::stdin().read_line(&mut width_input).expect("Failed to read line");
let width: i32 = width_input.trim().parse().expect("Invalid input");
// Чтение высоты прямоугольника
let mut height_input = String::new();
io::stdin().read_line(&mut height_input).expect("Failed to read line");
let height: i32 = height_input.trim().parse().expect("Invalid input");
// Чтение длины стороны квадрата
let mut side_input = String::new();
io::stdin().read_line(&mut side_input).expect("Failed to read line");
let side: i32 = side_input.trim().parse().expect("Invalid input");
// Чтение выбора
let mut choice_input = String::new();
io::stdin().read_line(&mut choice_input).expect("Failed to read line");
let choice: i32 = choice_input.trim().parse().expect("Invalid input");
// TODO: Напишите ваш код ниже
// Создайте экземпляр Rectangle, проверьте выбор и вычислите соответствующую площадь
// Вывод результата в зависимости от выбора
// Используйте: println!("Rectangle area: {}", area); или println!("Square area: {}", area);
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Продвинутое управление потоком выполнения
Выражение 'match'Сопоставление нескольких значенийСопоставление диапазоновВыражение 'if let'Циклы как выраженияИтоги — Простой парсер команд4Группировка данных с помощью структур
Что такое структура?Обзор структурДоступ к полям структурыИзменяемые структурыСтруктуры как параметры функцийКортежные структурыИтоги: создание структуры Book7Обработка ошибок с помощью 'Result'
Что такое 'Result'?Использование 'match' с 'Result'is_ok() и is_err()Сокращения: unwrap и expectОператор вопросительного знака '?'Парсинг строк в числаИтоги: функция безопасного деления10Замыкания и анонимные функции
Что такое замыкание?Определение простого замыканияЗамыкания с параметрамиЗахват окруженияИтоги: Простое замыкание-сумматор2Введение в векторы
Что такое вектор?Создание вектораДобавление элементов с помощью pushДоступ к элементам вектораИтерация по векторуИзменяемая итерацияУдаление элементовИтоги — Простой счетчик очков5Пары «ключ-значение» в Hash Map
Что такое Hash Map?Создание Hash MapВставка пар «ключ-значение»Доступ к значениямИтерация по Hash MapОбновление значенияУдаление парыИтоги — Счетчик слов8Проект: Простой инвентарь товаров
Настройка проектаДобавление товараПроверка наличияПродажа товараСобираем всё воедино3Список дел в командной строке
Настройка проектаДобавление задачиПросмотр всех задачУдаление задачиИтоговый код6Обработка отсутствия значения с 'Option'
Что такое 'Option'?Использование 'match' с 'Option'is_some() и is_none()Распаковка 'Option'Метод expectЗначение по умолчанию: unwrap_orИтоги: поиск элемента