Menu
CoddyTech

回顾:可打印的点

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

challenge icon

挑战

简单

让我们把你学过的所有标准 trait 结合起来,创建一个功能齐全的 Point 结构体,它可以进行调试、优雅地显示,并比较是否相等!

你将把代码分成两个文件:

  • point.rs:定义一个公开的 Point 结构体,其中包含公开的 x 和 y 字段(两者都是 i32)。你的 Point 应支持以下三项功能:
    • 使用 {:?} 进行调试打印。自动派生此功能。
    • 使用 {} 以 (x, y) 格式进行易读的显示:使用 std::fmt::Display 手动实现此功能。
    • 使用 == 比较是否相等:派生 PartialEq。
  • main.rs:引入你的 point 模块,并使用提供的输入创建两个 Point 实例。通过打印第一个点的调试格式、打印第二个点的显示格式,以及比较两个点是否相等,展示这三项功能。

你的输出应展示这三项 trait 功能:

Debug: Point { x: {x1}, y: {y1} }
Display: ({x2}, {y2})
Equal: {true/false}

例如,输入 3、5、3、5 时:

Debug: Point { x: 3, y: 5 }
Display: (3, 5)
Equal: true

输入 10、20、5、15 时:

Debug: Point { x: 10, y: 20 }
Display: (5, 15)
Equal: false

你将收到四个输入:第一个点的 x 和 y 坐标,接着是第二个点的 x 和 y 坐标。将每个输入解析为 i32。

亲手试试

mod point;

use point::Point;

fn main() {
    // 读取 4 个输入:x1、y1、x2、y2
    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 x2: i32 = input.trim().parse().expect("Invalid input");

    input.clear();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let y2: i32 = input.trim().parse().expect("Invalid input");

    // TODO:用输入创建两个 Point 实例

    // TODO:用调试格式 {:?} 输出第一个点
    // 格式:"Debug: Point { x: ..., y: ... }"

    // TODO:用显示格式 {} 输出第二个点
    // 格式:"Display: (..., ...)"

    // TODO:比较这两个点并输出结果
    // 格式:"Equal: true" 或 "Equal: false"
}

面向对象编程中的所有课

自己练习: Rust 在线编译器