Menu
CoddyTech

回顾:坐标点

本课属于 Coddy Rust 学习旅程的“面向对象编程”单元。第 28 课,共 61 课。

challenge icon

挑战

简单

让我们构建一个适用于任意数值类型的灵活坐标系!你将创建一个泛型 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:

  1. 使用前两个输入创建一个整数点(解析为 i32)
  2. 用第三个和第四个输入平移这个点(也解析为 i32)
  3. 使用第五个和第六个输入创建一个浮点数点(解析为 f64)
  4. 显示这三个点

你的输出应遵循以下格式:

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 在线编译器