Menu
CoddyTech

Ôn tập: Điểm có thể in ra

Thuộc phần Lập trình hướng đối tượng trong hành trình Rust của Coddy. Bài học 39 trên 61.

challenge icon

Thử thách

Dễ

Hãy kết hợp tất cả các trait tiêu chuẩn bạn đã học bằng cách tạo một struct Point đầy đủ tính năng, có thể gỡ lỗi, hiển thị đẹp mắt và so sánh bằng nhau!

Bạn sẽ sắp xếp code trong hai tệp:

  • point.rs: Định nghĩa một struct Point công khai với các trường x và y công khai (cả hai đều là i32). Point cần hỗ trợ ba khả năng:
    • In thông tin gỡ lỗi bằng {:?}. Tự động dẫn xuất khả năng này
    • Hiển thị thân thiện với người dùng bằng {} theo định dạng (x, y): tự triển khai khả năng này bằng std::fmt::Display
    • So sánh bằng nhau bằng ==: dẫn xuất PartialEq
  • main.rs: Đưa module point vào và tạo hai instance Point bằng các đầu vào đã cho. Minh họa cả ba khả năng bằng cách in điểm thứ nhất theo định dạng gỡ lỗi, in điểm thứ hai theo định dạng hiển thị và so sánh xem hai điểm có bằng nhau không.

Đầu ra của bạn cần thể hiện cả ba khả năng của trait:

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

Ví dụ, với các đầu vào 3, 5, 3, 5:

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

Và với các đầu vào 10, 20, 5, 15:

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

Bạn sẽ nhận bốn đầu vào: tọa độ x và y của điểm thứ nhất, sau đó là tọa độ x và y của điểm thứ hai. Hãy phân tích từng giá trị thành i32.

Tự làm thử

mod point;

use point::Point;

fn main() {
    // Đọc bốn đầu vào: 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: Tạo hai instance Point từ các đầu vào

    // TODO: In ra điểm thứ nhất theo định dạng gỡ lỗi {:?}
    // Định dạng: "Debug: Point { x: ..., y: ... }"

    // TODO: In ra điểm thứ hai theo định dạng hiển thị {}
    // Định dạng: "Display: (..., ...)"

    // TODO: So sánh hai điểm và in ra kết quả
    // Định dạng: "Equal: true" hoặc "Equal: false"
}

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Rust online