Menu
CoddyTech

Rangkuman: Pencetak Generik

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

challenge icon

Tantangan

Mudah

Mari kita buat sistem pengumuman fleksibel yang menunjukkan kekuatan batas trait! Kamu akan membuat trait Printable dan fungsi generik yang dapat mengumumkan tipe apa pun yang mengimplementasikan trait ini, untuk menunjukkan cara generik dan trait bekerja bersama dalam membuat kode yang dapat digunakan kembali dan aman terhadap tipe.

Kamu akan mengatur kodemu dalam dua file:

  • printable.rs: Definisikan trait publik Printable dengan method print_info yang menerima &self dan mengembalikan String. Lalu buat fungsi generik publik bernama announce yang menerima tipe apa pun T yang mengimplementasikan Printable. Fungsi ini harus mencetak Announcement: {info}, dengan {info} sebagai hasil pemanggilan print_info() pada item tersebut.
  • main.rs: Buat dua struct publik yang mengimplementasikan Printable:
    • Person: dengan field publik name (String). print_info-nya harus mengembalikan Person: {name}
    • Product: dengan field publik name (String) dan price (f64). print_info-nya harus mengembalikan Product: {name} - ${price}
    Sertakan module printable-mu, gunakan input untuk membuat Person dan Product, lalu panggil announce untuk masing-masing agar terlihat bahwa fungsi generikmu berfungsi dengan tipe Printable apa pun.

Keunggulan desain ini adalah announce tidak peduli apakah ia menerima Person, Product, atau tipe apa pun yang mungkin dibuat nanti. Syaratnya hanya tipe tersebut dapat memberikan informasi melalui print_info(). Batas trait menjaminnya saat compile.

Output-mu harus menampilkan kedua pengumuman:

Announcement: Person: {name}
Announcement: Product: {product_name} - ${price}

Contohnya, dengan input Alice, Laptop, dan 999.99:

Announcement: Person: Alice
Announcement: Product: Laptop - $999.99

Kamu akan menerima tiga input: nama orang, nama produk, dan harga produk (parse sebagai f64).

Coba sendiri

mod printable;

use printable::{Printable, announce};

// TODO: Definisikan struct publik Person dengan field publik name (String)
// Implementasikan trait Printable untuk Person
// print_info harus mengembalikan "Person: {name}"

// TODO: Definisikan struct publik Product dengan field publik name (String) dan price (f64)
// Implementasikan trait Printable untuk Product
// print_info harus mengembalikan "Product: {name} - ${price}"

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

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

    let mut price_input = String::new();
    std::io::stdin().read_line(&mut price_input).expect("Failed to read line");
    let price: f64 = price_input.trim().parse().expect("Failed to parse price");

    // TODO: Buat instance Person dengan person_name

    // TODO: Buat instance Product dengan product_name dan price

    // TODO: Panggil announce dengan Person

    // TODO: Panggil announce dengan Product
}

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Rust online