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ğine 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ö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 öğesinin Speak trait'ini uyguladığını söyler. İçinde, gerçek method gövdesini sağlarsın. Bir köpeğin nasıl konuştuğunu tanımladığın yer burasıdır.
Trait'lerin gücü, birden fazla tür aynı trait'i uyguladığında ortaya çıkar:
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 uygulayarak trait'leri 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 üç dosyada düzenleyeceksin:
describable.rs:describe(&self) -> Stringmetoduna sahip bir publicDescribabletrait'i tanımla.items.rs: trait'ini uygulayan iki public struct oluştur:- public
titlefield'ına (String) sahipBook - public
namefield'ına (String) sahipMovie
Describable'ı kendi benzersiz açıklama formatıyla uygulamalı.- public
main.rs: Modüllerini bir araya getir, her iki struct'ın instance'larını oluştur ve aynı trait'in farklı türler için nasıl farklı çıktılar ürettiğini göstermek üzeredescribemetodlarını çağır.
Book kendisini Book: {title} olarak ve Movie kendisini Film: {name} olarak açıklamalı. Her türün aynı sözleşmeyi kendi davranışıyla nasıl yerine getirdiğine dikkat et!
main dosyanda, sağlanan iki input'u kullanarak bir book ve bir movie oluştur, ardından açıklamalarını ayrı satırlara yazdır.
Çıktın şu formatı izlemeli:
Book: {title}
Film: {name}Örneğin, input'lar 1984 ve Inception olduğunda:
Book: 1984
Film: Inceptionİki input alacaksın: bir book title'ı ve bir movie name'i.
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.
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 PlayerKendi başına pratik yap: Online Rust derleyicisi