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 muncul 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 object trait, kamu bisa membuat vector yang menampung apa pun 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 "sebuah vector 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 vector.

Pola ini penting untuk membangun sistem yang fleksibel saat kamu perlu mengelola kumpulan object yang saling berkaitan 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, yaitu email, pesan SMS, dan notifikasi push, semuanya dalam satu vektor menggunakan object trait.

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: Gunakan module notifications dan buat vektor bertipe Vec<Box<dyn Notify>> yang menampung ketiga jenis notifikasi. Gunakan input yang diberikan untuk membuat satu notifikasi dari setiap jenis, tambahkan semuanya ke vektormu secara berurutan (Email, Sms, Push), lalu cetak hasil pemanggilan send() pada elemen pertama vektor.

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

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 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