Struct Screen
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Rust di Coddy. Pelajaran 52 dari 61.
Tantangan
MudahSekarang saatnya menyatukan semua komponen UI-mu! Kamu akan membuat struct Screen yang dapat menyimpan kumpulan berbagai komponen yang bisa digambar menggunakan object trait. Di sinilah keunggulan Vec<Box<dyn Draw>> benar-benar terlihat: satu kumpulan yang mengelola berbagai tipe komponen.
Kamu akan menambahkan module baru ke proyekmu yang terus berkembang:
draw.rs: TraitDrawdari tantangan sebelumnya.text_field.rs: KomponenTextFieldyang mencetakText: {content}.button.rs: KomponenButtonyang mencetakButton: {label} (width: {width}).screen.rs: Buat structScreenyang menyimpan field publikcomponentsbertipeVec<Box<dyn Draw>>. Implementasikan fungsi terkaitnewyang membuat screen kosong, dan methodaddyang menerimaBox<dyn Draw>dan menambahkannya ke vector components.main.rs: Satukan semua module. BuatScreen, tambahkanTextFielddanButtonke dalamnya, lalu lakukan iterasi melalui components screen dan panggildraw()pada masing-masing.
Screen perlu menyimpan object trait, jadi kamu akan menggunakan kata kunci dyn dengan trait Draw. Method add harus menerima &mut self karena method itu mengubah vector components.
Input berikut akan diberikan:
- Baris pertama: konten text field
- Baris kedua: label button
- Baris ketiga: lebar button (berupa angka)
Output-mu harus menampilkan setiap komponen pada barisnya sendiri, sesuai urutan penambahannya:
Text: Hello
Button: Click Me (width: 80)Coba sendiri
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");
// TODO: Buat Screen menggunakan Screen::new()
// TODO: Tambahkan TextField yang dibungkus dengan Box::new() ke screen
// TODO: Tambahkan Button yang dibungkus dengan Box::new() ke screen
// TODO: Iterasi setiap komponen di screen.components dan panggil draw() pada masing-masing komponen
}Semua pelajaran di Pemrograman Berorientasi Objek
1Method dan Perilaku
Pengantar Blok ImplementasiParameter SelfMethod MutableFungsi TerkaitBeberapa Blok ImplementasiMethod BerantaiRangkuman: Aksi Persegi Panjang4Proyek: Hewan Peliharaan Virtual
Mendefinisikan Hewan PeliharaanMemberi Makan Hewan Peliharaan2Enkapsulasi dan module
Dasar-Dasar moduleKata Kunci publicField privateGetterSetterRekap: Loker AmanLatihan sendiri: Compiler Rust online