Traitleri Uygulama
Coddy'nin Rust Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 30 / 61.
Artık bir trait'in nasıl tanımlanacağını 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ışa bağlar.
Söz dizimi impl TraitName for StructName yapısını 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 türünün Speak trait'ini uyguladığını söyler. İçerisinde, gerçek metot gövdesini sağlarsınız; burası bir köpeğin nasıl konuştuğunu tanımladığınız yerdir.
Birden fazla tür aynı trait'i uyguladığında trait'lerin 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şıyor, ancak her biri kendi benzersiz uygulamasını sunar. Her iki tür üzerinde de .speak() metodunu çağırabilirsiniz:
let dog = Dog { name: String::from("Rex") };
let cat = Cat { name: String::from("Whiskers") };
println!("{}", dog.speak()); // Rex şöyle der: Woof!
println!("{}", cat.speak()); // Whiskers şöyle der: Meow!
Bu, Rust'taki polimorfizmin temelidir—farklı türler, aynı arayüz, benzersiz davranışlar.
Görev
KolayTrait'leri farklı türler için uygulayarak hayata geçirelim! Bir Describable trait'i oluşturacak ve bunu, her biri kendi benzersiz açıklamasını sunan iki farklı struct için uygulayacaksınız.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
describable.rs:describe(&self) -> Stringmetoduna sahip genel (public) birDescribabletrait'i tanımlayın.items.rs: Trait'inizi uygulayan iki genel struct oluşturun:- Genel bir
titlealanına (String) sahipBook - Genel bir
namealanına (String) sahipMovie
Describabletrait'ini kendi benzersiz açıklama formatıyla uygulamalıdır.- Genel bir
main.rs: Modüllerinizi bir araya getirin, her iki struct'tan da örnekler oluşturun ve aynı trait'in farklı türler için nasıl farklı çıktılar ürettiğini göstermek içindescribemetodlarını çağırın.
Book struct'ınız kendisini Book: {title} olarak, Movie struct'ınız ise kendisini Film: {name} olarak tanımlamalıdır. Her türün aynı sözleşmeyi (contract) nasıl kendi davranışıyla yerine getirdiğine dikkat edin!
Ana dosyanızda, sağlanan iki girişi kullanarak bir kitap ve bir film oluşturun, ardından açıklamalarını ayrı satırlara yazdırın.
Çıktınız şu formatta olmalıdır:
Book: {title}
Film: {name}Örneğin, 1984 ve Inception girişleri için:
Book: 1984
Film: Inceptionİki giriş alacaksınız: bir kitap başlığı ve bir film adı.
Kopya kağıdı
Bir struct için bir trait uygulamak için impl TraitName for StructName sözdizimini kullanın:
trait Speak {
fn speak(&self) -> String;
}
struct Dog {
name: String,
}
impl Speak for Dog {
fn speak(&self) -> String {
format!("{} says: Woof!", self.name)
}
}
Birden fazla tür, aynı trait'i farklı davranışlarla uygulayabilir:
struct Cat {
name: String,
}
impl Speak for Cat {
fn speak(&self) -> String {
format!("{} says: Meow!", self.name)
}
}
let dog = Dog { name: String::from("Rex") };
let cat = Cat { name: String::from("Whiskers") };
println!("{}", dog.speak()); // Rex says: Woof!
println!("{}", cat.speak()); // Whiskers says: Meow!
Bu, Rust'ta polimorfizmi mümkün kılar; farklı türler aynı arayüzü benzersiz uygulamalarla paylaşır.
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: Başlık ile bir Book örneği oluşturun
// TODO: İsim ile bir Movie örneği oluşturun
// TODO: Kitabın açıklamasını yazdırın
// TODO: Filmin açıklamasını yazdırın
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Object Oriented Programming 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 Player