Özet - Generic Yazıcı
Coddy'nin Rust Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 44 / 61.
Görev
KolayTrait sınırlarının gücünü gösteren esnek bir duyuru sistemi oluşturalım! Bir Printable trait'i ve bu trait'i uygulayan herhangi bir türü duyurabilen genel bir işlev oluşturacaksınız: generic'lerin ve trait'lerin yeniden kullanılabilir, tür güvenli kod oluşturmak için nasıl birlikte çalıştığını göreceksiniz.
Kodunuzu iki dosya arasında düzenleyeceksiniz:
printable.rs:Printablealan veprint_infodöndüren bir&selfmetoduna sahip public birStringtrait'i tanımlayın. Ardındanannounceuygulayan herhangi birTtürünü kabul eden,Printableadlı public bir generic işlev oluşturun. Bu işlev, öğe üzerindeAnnouncement: {info}çağrısının sonucunun{info}olduğuprint_info()ifadesini yazdırmalıdır.main.rs:Printableuygulayan iki public struct oluşturun:Person: public birnamealanına (String) sahip.print_infometoduPerson: {name}döndürmelidirProduct: publicname(String) veprice(f64) alanlarına sahip.print_infometoduProduct: {name} - ${price}döndürmelidir
announcetürüyle çalıştığını göstermek için her biriylePrintableişlevini çağırın.
Bu tasarımın güzelliği, announce işlevinin bir Person, Product veya gelecekteki herhangi bir tür alıp almadığını önemsememesidir. Yalnızca türün print_info() aracılığıyla bilgi sağlayabilmesini gerektirir. Trait sınırı bunu derleme zamanında garanti eder.
Çıktınız her iki duyuruyu da göstermelidir:
Announcement: Person: {name}
Announcement: Product: {product_name} - ${price}Örneğin, Alice, Laptop ve 999.99 girdileriyle:
Announcement: Person: Alice
Announcement: Product: Laptop - $999.99Üç girdi alacaksınız: kişinin adı, ürün adı ve ürün fiyatı (f64 olarak ayrıştırın).
Kendin dene
mod printable;
use printable::{Printable, announce};
// TODO: public name alanı (String) olan public bir struct Person tanımla
// Person için Printable trait'ini uygula
// print_info "Person: {name}" döndürmeli
// TODO: public name (String) ve price (f64) alanları olan public bir struct Product tanımla
// Product için Printable trait'ini uygula
// print_info "Product: {name} - ${price}" döndürmeli
fn main() {
// Girdileri oku
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: person_name ile bir Person örneği oluştur
// TODO: product_name ve price ile bir Product örneği oluştur
// TODO: Person ile announce'ı çağır
// TODO: Product ile announce'ı çağır
}
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Metotlar ve Davranış
Uygulama Bloklarına GirişSelf ParametresiDeğiştirilebilir Metotlarİlişkili FonksiyonlarBirden Fazla Uygulama BloğuMetot ZincirlemeÖzet - Dikdörtgen Eylemleri4Proje: Sanal Evcil Hayvan
Evcil Hayvanı TanımlamaEvcil Hayvanı Besleme2Kapsülleme ve Modüller
Modül TemelleriPublic Anahtar KelimesiPrivate AlanlarGetter'larSetter'larÖzet - Güvenli Kasa5Generic Yapılar
Generic Struct'larGeneric MetotlarÇoklu Generic TürlerGeneric FonksiyonlarÖzet - Koordinat Noktası8Sınırlandırıcı Olarak Trait'ler
Trait Sınırlandırıcı SözdizimiÇoklu SınırlandırıcılarWhere CümleciğiTrait'ler ile Tip DöndürmeÖzet - Generic Yazıcı11Rust'ta Tasarım Kalıpları
Newtype KalıbıKompozisyonDrop Trait'iFrom ve IntoÖzet - Smart Pointer Mock3İleri Seviye Enum'lar
Veri İçeren Enum'larEnum MetotlarıVeri Varyantlarını EşlemeOption Enum'ına Yeniden BakışÖzet - Shape Enum6Trait Tanımlama
Trait Nedir?Traitleri UygulamaVarsayılan UygulamalarVarsayılanları Geçersiz KılmaParametreli TraitlerÖzet - Media PlayerKendi başına pratik yap: Online Rust derleyicisi