Повторение — Координатная точка
Часть раздела Object Oriented Programming путешествия по Rust на Coddy — урок 28 из 61.
Задание
ЛегкоДавайте создадим гибкую систему координат, которая работает с любым числовым типом! Вы создадите универсальную структуру Point, которая может представлять позиции, используя целые числа для игр на основе сетки или числа с плавающей запятой для точной графики — и все это на основе одного определения.
Вы организуете свой код в двух файлах:
point.rs: Определите публичную универсальную структуруPoint<T>с двумя публичными полями:xиy, оба типаT. Реализуйте методы для вашей точки:- Ассоциированную функцию
new, которая создает точку из координат x и y - Метод
translate, который принимает значения dx и dy и возвращает новуюPointс координатами, смещенными на эти значения (это требует, чтобыTподдерживал сложение и копирование, поэтому используйте ограничениеT: std::ops::Add<Output = T> + Copy)
- Ассоциированную функцию
main.rs: Подключите модуль point и продемонстрируйте, как одна и та же универсальная структура бесперебойно работает с различными числовыми типами.
В основном файле продемонстрируйте вашу универсальную структуру Point следующим образом:
- Создайте целочисленную точку, используя первые два входных значения (преобразованные в
i32) - Сместите ее на третье и четвертое входные значения (также
i32) - Создайте точку с плавающей запятой, используя пятое и шестое входные значения (преобразованные в
f64) - Выведите все три точки
Ваш вывод должен соответствовать следующему формату:
Integer point: ({x}, {y})
After translation: ({x}, {y})
Float point: ({x}, {y})Например, при входных данных 3, 5, 2, -1, 1.5 и 2.5:
Integer point: (3, 5)
After translation: (5, 4)
Float point: (1.5, 2.5)Обратите внимание, как Point::new(3, 5) создает Point<i32>, в то время как Point::new(1.5, 2.5) создает Point<f64> — одно и то же определение структуры адаптируется к обоим случаям!
Вы получите шесть входных значений: два целых числа для первой точки, два целых числа для смещения и два числа с плавающей запятой для второй точки.
Попробуйте сами
mod point;
use point::Point;
fn main() {
// Чтение входных данных
let mut input = String::new();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let x1: i32 = input.trim().parse().expect("Invalid input");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let y1: i32 = input.trim().parse().expect("Invalid input");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let dx: i32 = input.trim().parse().expect("Invalid input");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let dy: i32 = input.trim().parse().expect("Invalid input");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let x2: f64 = input.trim().parse().expect("Invalid input");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let y2: f64 = input.trim().parse().expect("Invalid input");
// TODO: Создайте целочисленную точку, используя x1 и y1
// TODO: Переместите целочисленную точку на dx и dy
// TODO: Создайте точку с плавающей запятой, используя x2 и y2
// TODO: Выведите результаты в требуемом формате:
// println!("Integer point: ({}, {})", ...);
// println!("After translation: ({}, {})", ...);
// println!("Float point: ({}, {})", ...);
}
Все уроки раздела Object Oriented Programming
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media Player