Menu
CoddyTech

Chạy Screen

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 53 trên 61.

challenge icon

Thử thách

Dễ

Chúc mừng bạn đã đến bước cuối cùng của dự án Document System! Bạn đã xây dựng xong từng phần riêng lẻ: trait Draw, TextField, Button và Screen. Giờ là lúc giúp Screen hiển thị tất cả thành phần cùng lúc chỉ bằng một lần gọi phương thức.

Bạn sẽ hoàn thành dự án bằng cách thêm phương thức run vào cấu trúc Screen. Phương thức này sẽ duyệt qua tất cả thành phần được lưu trong màn hình và gọi draw() cho từng thành phần, giúp toàn bộ hệ thống tài liệu của bạn hoạt động.

Các tệp trong dự án:

  • draw.rs: Trait Draw có phương thức draw.
  • text_field.rs: Thành phần TextField in ra Text: {content}.
  • button.rs: Thành phần Button in ra Button: {label} (width: {width}).
  • screen.rs: Cấu trúc Screen có các phương thức new và add. Thêm phương thức run nhận &self và gọi draw() cho từng thành phần trong tập hợp.
  • main.rs: Kết hợp mọi thứ: tạo một Screen, thêm các thành phần và gọi run() để hiển thị toàn bộ màn hình trong một lần.

Phương thức run gói gọn logic hiển thị bên trong Screen, giúp hàm main gọn gàng và đơn giản. Thay vì tự duyệt qua các thành phần trong main, bạn chỉ cần gọi screen.run().

Các đầu vào sau sẽ được cung cấp:

  • Dòng đầu tiên: nội dung của trường văn bản
  • Dòng thứ hai: nhãn của nút
  • Dòng thứ ba: chiều rộng của nút (dạng số)

Đầu ra cần hiển thị từng thành phần trên một dòng riêng, theo thứ tự chúng được thêm vào:

Text: Dashboard
Button: Save (width: 120)

Tự làm thử

mod draw;
mod text_field;
mod button;
mod screen;

use draw::Draw;
use text_field::TextField;
use button::Button;
use screen::Screen;

pub struct Label {
    pub text: String,
}

impl Draw for Label {
    fn draw(&self) {
        println!("{}", self.text);
    }
}

fn main() {
    let mut input1 = String::new();
    std::io::stdin().read_line(&mut input1).expect("Failed to read line");
    let content = input1.trim().to_string();

    let mut input2 = String::new();
    std::io::stdin().read_line(&mut input2).expect("Failed to read line");
    let label = input2.trim().to_string();

    let mut input3 = String::new();
    std::io::stdin().read_line(&mut input3).expect("Failed to read line");
    let width: u32 = input3.trim().parse().expect("Failed to parse width");

    let mut screen = Screen::new();

    let text_field = TextField { content };
    screen.add(Box::new(text_field));

    let button = Button { label, width };
    screen.add(Box::new(button));

    // TODO: Thay phần lặp thủ công bên dưới bằng một lệnh gọi duy nhất đến screen.run()
    for component in &screen.components {
        component.draw();
    }
}

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