Menu
CoddyTech

Vektor Trait

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

Kamu sudah melihat bagaimana Box<dyn Trait> memungkinkan satu variabel menyimpan berbagai tipe. Kekuatan sebenarnya terlihat saat kamu menggabungkannya dengan koleksi: menyimpan beberapa tipe berbeda dalam satu vector.

Vector biasa mengharuskan semua elemennya memiliki tipe yang sama. Kamu tidak bisa memiliki Vec<Dog> yang juga berisi kucing. Namun, dengan trait object, kamu bisa membuat vector yang berisi apa saja yang mengimplementasikan trait yang sama:

trait Speak {
    fn speak(&self) -> String;
}

struct Dog;
struct Cat;
struct Bird;

impl Speak for Dog {
    fn speak(&self) -> String { String::from("Woof!") }
}

impl Speak for Cat {
    fn speak(&self) -> String { String::from("Meow!") }
}

impl Speak for Bird {
    fn speak(&self) -> String { String::from("Tweet!") }
}

fn main() {
    let animals: Vec<Box<dyn Speak>> = vec![
        Box::new(Dog),
        Box::new(Cat),
        Box::new(Bird),
    ];
}

Tipe Vec<Box<dyn Speak>> berarti "vektor berisi object trait yang dibungkus dalam box." Setiap elemen adalah Box yang menunjuk ke sesuatu yang mengimplementasikan Speak: tipe sebenarnya bisa berbeda-beda. Kamu membungkus setiap nilai dengan Box::new() saat menambahkannya ke vektor.

Pola ini penting untuk membangun sistem fleksibel ketika kamu perlu mengelola kumpulan object yang saling terkait tetapi berbeda, seperti komponen UI, entitas game, atau sistem plugin.

challenge icon

Tantangan

Mudah

Mari buat sistem notifikasi yang dapat menangani berbagai jenis peringatan! Kamu akan membuat koleksi yang menyimpan berbagai jenis notifikasi, email, pesan SMS, dan notifikasi push, semuanya dalam satu vector menggunakan trait object.

Kamu akan mengatur kodemu dalam dua file:

  • notifications.rs: Definisikan trait Notify publik dengan method send yang menerima &self dan mengembalikan String yang menjelaskan notifikasi yang dikirim. Lalu, buat tiga struct publik:
    • Email: dengan field recipient publik (String). Method send-nya harus mengembalikan Email to: {recipient}
    • Sms: dengan field phone publik (String). Method send-nya harus mengembalikan SMS to: {phone}
    • Push: dengan field device publik (String). Method send-nya harus mengembalikan Push to: {device}
  • main.rs: Muat module notifikasi dan buat vector bertipe Vec<Box<dyn Notify>> yang menampung ketiga jenis notifikasi. Gunakan input yang diberikan untuk membuat satu notifikasi dari setiap jenis, tambahkan ke vector secara berurutan (Email, Sms, Push), lalu cetak hasil pemanggilan send() pada elemen pertama vector.

Konsep utamanya adalah meskipun Email, Sms, dan Push merupakan struct yang sepenuhnya berbeda, semuanya dapat berada bersama dalam vector yang sama karena memiliki trait Notify. Setiap elemen dibungkus dengan Box::new() untuk membuat trait object.

Output-mu harus menampilkan notifikasi pertama:

Email to: {recipient}

Contohnya, dengan input alice@example.com, 555-1234, dan iPhone-12:

Email to: alice@example.com

Kamu akan menerima tiga input: penerima email, nomor telepon, dan nama perangkat.

Coba sendiri

mod notifications;

use notifications::{Notify, Email, Sms, Push};

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

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

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

    // TODO: Buat Vec<Box<dyn Notify>> untuk menyimpan berbagai tipe notifikasi
    // TODO: Buat instance Email, Sms, dan Push menggunakan input
    // TODO: Tambahkan semuanya ke vektor sesuai urutan (Email, Sms, Push) menggunakan Box::new()
    // TODO: Cetak hasil pemanggilan send() pada elemen pertama
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Rust online