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.
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: TraitDrawcó phương thứcdraw.text_field.rs: Thành phầnTextFieldin raText: {content}.button.rs: Thành phầnButtonin raButton: {label} (width: {width}).screen.rs: Cấu trúcScreencó các phương thứcnewvàadd. Thêm phương thứcrunnhận&selfvà gọidraw()cho từng thành phần trong tập hợp.main.rs: Kết hợp mọi thứ: tạo mộtScreen, thêm các thành phần và gọirun()để 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
1Phương thức và hành vi
Nhập môn khối triển khaiTham số selfPhương thức có thể thay đổiHàm liên kếtNhiều khối triển khaiNối chuỗi phương thứcÔn tập: thao tác với hình chữ nhật4Dự án: Thú cưng ảo
Định nghĩa thú cưngCho thú cưng ăn7Các trait tiêu chuẩn
Trait DebugTrait DisplayClone và CopyCác trait so sánh bằngÔn tập: Điểm có thể in ra2Tính đóng gói và module
Kiến thức cơ bản về moduleTừ khóa publicTrường riêng tưHàm lấy giá trịHàm thiết lập giá trịÔn tập: tủ khóa an toàn5Kiểu tổng quát
Cấu trúc tổng quátPhương thức tổng quátNhiều kiểu tổng quátHàm tổng quátÔn tập: điểm tọa độTự luyện tập: Trình biên dịch Rust online