Rangkuman: Pencetak Generik
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Rust di Coddy. Pelajaran 44 dari 61.
Tantangan
MudahMari 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 publikPrintabledengan methodprint_infoyang menerima&selfdan mengembalikanString. Lalu buat fungsi generik publik bernamaannounceyang menerima tipe apa punTyang mengimplementasikanPrintable. Fungsi ini harus mencetakAnnouncement: {info}, dengan{info}sebagai hasil pemanggilanprint_info()pada item tersebut.main.rs: Buat dua struct publik yang mengimplementasikanPrintable:Person: dengan field publikname(String).print_info-nya harus mengembalikanPerson: {name}Product: dengan field publikname(String) danprice(f64).print_info-nya harus mengembalikanProduct: {name} - ${price}
announceuntuk masing-masing agar terlihat bahwa fungsi generikmu berfungsi dengan tipePrintableapa 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.99Kamu 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
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 Aman8Trait sebagai Batasan
Sintaks Batasan TraitBeberapa BatasanKlausa whereMengembalikan Tipe dengan TraitRangkuman: Pencetak GenerikLatihan sendiri: Compiler Rust online