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.
Tantangan
MudahMari 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 traitNotifypublik dengan methodsendyang menerima&selfdan mengembalikanStringyang menjelaskan notifikasi yang dikirim. Lalu, buat tiga struct publik:Email: dengan fieldrecipientpublik (String). Methodsend-nya harus mengembalikanEmail to: {recipient}Sms: dengan fieldphonepublik (String). Methodsend-nya harus mengembalikanSMS to: {phone}Push: dengan fielddevicepublik (String). Methodsend-nya harus mengembalikanPush to: {device}
main.rs: Muat module notifikasi dan buat vector bertipeVec<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 pemanggilansend()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.comKamu 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
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
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