Menu
CoddyTech

Struct Screen

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Rust di Coddy. Pelajaran 52 dari 61.

challenge icon

Tantangan

Mudah

Sekarang 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: Trait Draw dari tantangan sebelumnya.
  • text_field.rs: Komponen TextField yang mencetak Text: {content}.
  • button.rs: Komponen Button yang mencetak Button: {label} (width: {width}).
  • screen.rs: Buat struct Screen yang menyimpan field publik components bertipe Vec<Box<dyn Draw>>. Implementasikan fungsi terkait new yang membuat screen kosong, dan method add yang menerima Box<dyn Draw> dan menambahkannya ke vector components.
  • main.rs: Satukan semua module. Buat Screen, tambahkan TextField dan Button ke dalamnya, lalu lakukan iterasi melalui components screen dan panggil draw() 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

Latihan sendiri: Compiler Rust online