Итоги — перечисление Shape
Часть раздела Object Oriented Programming путешествия по Rust на Coddy — урок 18 из 61.
Задание
ЛегкоДавайте создадим геометрический калькулятор, который использует перечисление (enum) для представления различных фигур, каждая из которых хранит свои собственные размеры. Ваше перечисление Shape продемонстрирует, как один тип может содержать различные структуры данных и обеспечивать унифицированное поведение с помощью методов.
Вы создадите два файла для организации вашего кода:
shape.rs: Определите публичное перечислениеShapeс двумя вариантами:Circle— содержит одно значениеf64, представляющее радиус (синтаксис кортежа)Rectangle— содержит именованные поля:width(f64) иheight(f64)
area, который использует сопоставление с образцом (pattern matching) для вычисления правильной площади в зависимости от варианта. Для кругов используйте3.14159в качестве π.main.rs: Подключите ваш модуль shape, создайте по одному экземпляру каждого варианта фигуры, используя предоставленные входные данные, и выведите площадь каждой фигуры.
Ваш метод area должен возвращать f64. При сопоставлении деструктурируйте каждый вариант, чтобы извлечь его размеры, и примените соответствующую формулу:
- Площадь круга:
π × radius² - Площадь прямоугольника:
width × height
Ваш вывод должен отображать площадь каждой фигуры на отдельной строке с ровно одним десятичным знаком:
Circle area: {area}
Rectangle area: {area}Например, при радиусе круга 5.0 и прямоугольнике с шириной 4.0 и высотой 6.0 вывод будет следующим:
Circle area: 78.5
Rectangle area: 24.0Вы получите три входных значения: радиус круга, ширину прямоугольника и высоту прямоугольника.
Попробуйте сами
mod shape;
use shape::Shape;
fn main() {
// Чтение входных данных
let mut radius_input = String::new();
std::io::stdin().read_line(&mut radius_input).expect("Failed to read line");
let radius: f64 = radius_input.trim().parse().expect("Invalid number");
let mut width_input = String::new();
std::io::stdin().read_line(&mut width_input).expect("Failed to read line");
let width: f64 = width_input.trim().parse().expect("Invalid number");
let mut height_input = String::new();
std::io::stdin().read_line(&mut height_input).expect("Failed to read line");
let height: f64 = height_input.trim().parse().expect("Invalid number");
// TODO: Создайте фигуру Circle (круг), используя радиус
// TODO: Создайте фигуру Rectangle (прямоугольник), используя ширину и высоту
// TODO: Выведите площадь каждой фигуры с одним знаком после запятой
// Формат: "Circle area: {area}" и "Rectangle area: {area}"
}
Все уроки раздела Object Oriented Programming
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media Player