Повторение — Координатная точка
Часть раздела Объектно-ориентированное программирование путешествия по Rust на Coddy. Урок 28 из 61.
Задание
ЛегкоДавайте создадим гибкую систему координат, которая работает с любым числовым типом! Вы создадите generic Point struct, способный представлять положения, используя integer для игр на основе сетки или floating-point числа для точной графики: всё из одного определения.
Вы организуете свой код в двух файлах:
point.rs: Define public genericPoint<T>struct с двумя public fields:xиy, оба типаT. Implement methods для вашего point:- associated function
new, которая создаёт point из координат x и y translatemethod, принимающий значения dx и dy и returns новыйPointсо сдвинутыми на эти величины координатами (для этого требуется, чтобыTимел support addition и copying, поэтому используйте boundT: std::ops::Add<Output = T> + Copy)
- associated function
main.rs: Подключите свой модуль point и продемонстрируйте, как один и тот же generic struct без проблем работает с разными числовыми типами.
В своём основном файле продемонстрируйте работу generic Point следующим образом:
- Создайте integer point, используя первые два inputs (распарсенные как
i32) - Переместите его на величины из третьего и четвёртого inputs (также
i32) - Создайте floating-point point, используя пятый и шестой inputs (распарсенные как
f64) - Выведите все три point
Ваш вывод должен соответствовать этому формату:
Integer point: ({x}, {y})
After translation: ({x}, {y})
Float point: ({x}, {y})Например, для inputs 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>: одно и то же определение struct адаптируется к обоим типам!
Вы получите шесть inputs: два integer для первого point, два integer для translation и два float для второго point.
Попробуйте сами
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: Create an integer point using x1 and y1
// TODO: Translate the integer point by dx and dy
// TODO: Создать точку с плавающей точкой, используя x2 и y2
// TODO: Вывести результаты в требуемом формате:
// println!("Integer point: ({}, {})", ...);
// println!("After translation: ({}, {})", ...);
// println!("Float point: ({}, {})", ...);
}
Все уроки раздела Объектно-ориентированное программирование
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media PlayerПотренируйтесь самостоятельно: Онлайн-компилятор Rust