回顾:坐标点
本课属于 Coddy Rust 学习旅程的“面向对象编程”单元。第 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:
- 使用前两个输入创建一个整数点(解析为
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: 将整数坐标点沿 x 方向移动 dx,沿 y 方向移动 dy
// TODO: 用 x2 和 y2 创建一个浮点数坐标点
// TODO: 按要求的格式输出结果:
// println!("Integer point: ({}, {})", ...);
// println!("After translation: ({}, {})", ...);
// println!("Float point: ({}, {})", ...);
}
面向对象编程中的所有课
自己练习: Rust 在线编译器