Traitleri Uygulama
Coddy'nin Rust Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 30 / 61.
Artık bir trait’i nasıl tanımlayacağınızı bildiğinize göre, bir struct’ın bu sözleşmeyi nasıl yerine getireceğini görelim. Bir trait’i uygulamak, soyut gereksinimi somut davranışla ilişkilendirir.
Sözdizimi impl TraitName for StructName kullanır:
trait Speak {
fn speak(&self) -> String;
}
struct Dog {
name: String,
}
impl Speak for Dog {
fn speak(&self) -> String {
format!("{} says: Woof!", self.name)
}
}
impl Speak for Dog bloğu, Rust'a Dog yapısının Speak trait'ini uyguladığını bildirir. İçeride, gerçek metot gövdesini sağlarsın. Bir köpeğin nasıl konuştuğunu burada tanımlarsın.
Birden fazla tür aynı özelliği uyguladığında, özelliklerin gücü netleşir:
struct Cat {
name: String,
}
impl Speak for Cat {
fn speak(&self) -> String {
format!("{} says: Meow!", self.name)
}
}
Hem Dog hem de Cat artık Speak yeteneğini paylaşır, ancak her biri kendine özgü bir uygulama sunar. Her iki tür üzerinde de .speak() çağırabilirsin:
let dog = Dog { name: String::from("Rex") };
let cat = Cat { name: String::from("Whiskers") };
println!("{}", dog.speak()); // Rex diyor: Hav!
println!("{}", cat.speak()); // Whiskers diyor: Miyav!
Rust'ta çok biçimliliğin temeli budur: farklı türler, aynı arayüz, benzersiz davranışlar.
Görev
KolayFarklı türler için trait'leri uygulayarak onları hayata geçirelim! Bir Describable trait'i oluşturacak ve bunu iki farklı struct için uygulayacaksın; her struct kendi benzersiz açıklamasını sağlayacak.
Kodunu üç dosyaya ayıracaksın:
describable.rs:Describablemetoduna sahip, herkese açık birdescribe(&self) -> Stringtrait'i tanımla.items.rs: Trait'ini uygulayan iki herkese açık struct oluştur:- Herkese açık bir
Bookalanına (String) sahiptitle - Herkese açık bir
Moviealanına (String) sahipname
Describabletrait'ini uygulamalıdır.- Herkese açık bir
main.rs: Modüllerini bir araya getir, her iki struct'ın örneklerini oluştur ve aynı trait'in farklı türler için nasıl farklı çıktılar ürettiğini göstermek üzeredescribemetotlarını çağır.
Book kendisini Book: {title} olarak, Movie ise kendisini Film: {name} olarak açıklamalıdır. Her türün aynı sözleşmeyi kendi davranışıyla yerine getirdiğine dikkat et!
Ana dosyanda, sağlanan iki girdiyi kullanarak bir kitap ve bir film oluştur, ardından açıklamalarını ayrı satırlarda yazdır.
Çıktın şu biçimi izlemelidir:
Book: {title}
Film: {name}Örneğin, girdiler 1984 ve Inception olduğunda:
Book: 1984
Film: Inceptionİki girdi alacaksın: bir kitap başlığı ve bir film adı.
GEREKLİ ÇIKTI BİÇİMİ:Kendin dene
mod describable;
mod items;
use describable::Describable;
use items::{Book, Movie};
fn main() {
// Girdileri oku
let mut title = String::new();
std::io::stdin().read_line(&mut title).expect("Failed to read line");
let title = title.trim().to_string();
let mut name = String::new();
std::io::stdin().read_line(&mut name).expect("Failed to read line");
let name = name.trim().to_string();
// TODO: title ile bir Book örneği oluştur
// TODO: name ile bir Movie örneği oluştur
// TODO: Kitabın açıklamasını yazdır
// TODO: Filmin açıklamasını yazdır
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
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