Varsayılanları Geçersiz Kılma
Coddy'nin Rust Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 32 / 61.
Varsayılan uygulamalar kullanışlıdır, ancak bazen bir türün standarttan farklı bir davranışa ihtiyacı olur. Bu durum gerçekleştiğinde, impl bloğunda kendi uygulamanızı sağlayarak varsayılanı geçersiz kılabilirsiniz.
Yöntemi aynı imzayla tanımlamanız, ancak kendi özel mantığınızı eklemeniz yeterlidir:
trait Greet {
fn greet(&self) -> String {
String::from("Hello there!")
}
}
struct Robot {
id: u32,
}
impl Greet for Robot {
fn greet(&self) -> String {
format!("BEEP BOOP. Unit {} online.", self.id)
}
}
Greet varsayılan bir greet metodu sağlasa da, Robot bunu tamamen kendi sürümüyle değiştirir. Bir Robot üzerinde greet() çağırdığınızda, Rust özel uygulamayı kullanır:
let bot = Robot { id: 42 };
println!("{}", bot.greet()); // BEEP BOOP. Ünite 42 çevrimiçi.
Bu size esneklik sağlar; varsayılan davranıştan memnun olan türlerin herhangi bir şey yazması gerekmezken, özel davranışa ihtiyaç duyan türler sadece ilgilendikleri metotları geçersiz kılabilirler (override). Trait, uygulayan her türün ilgili metoda sahip olduğunu garanti etmeye devam eder.
Görev
KolayFarklı uyarı türlerinin mesajlarını özelleştirebildiği bir bildirim sistemi kuralım! Varsayılan bir uygulamaya sahip bir trait oluşturacak, ardından bir türün varsayılanı kullanmasını sağlarken diğerinin bunu özel bir davranışla geçersiz kılmasını (override) sağlayacaksınız.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
notifiable.rs: Varsayılan uygulaması"Alert: Something happened!"döndüren birnotify(&self) -> Stringmetoduna sahip, genel (public) birNotifiabletrait'i tanımlayın.alerts.rs: Trait'inizi farklı şekilde uygulayan iki genel struct oluşturun:GenericAlert— varsayılan bildirimi kullanan bir unit struct (boş impl bloğu)UrgentAlert— varsayılanı geçersiz kılarak (override),{message}saklanan mesajı olmak üzere"URGENT: {message}"döndüren, genel birmessagealanına (String) sahip bir struct.
main.rs: Modüllerinizi bir araya getirin ve her iki davranışı da sergileyin. Sağlanan girdiyi kullanarak birGenericAlertve birUrgentAlertoluşturun, ardından bildirimlerini yazdırın.
Buradaki temel nokta, GenericAlert'in varsayılan uygulamadan doğrudan faydalanması, UrgentAlert'in ise metodu kendi impl bloğunda tanımlayarak kendi özelleştirilmiş sürümünü sunmasıdır.
Çıktınız şu formatta olmalıdır:
Alert: Something happened!
URGENT: {message}Örneğin, Server is down! girdisi ile:
Alert: Something happened!
URGENT: Server is down!Bir girdi alacaksınız: acil uyarı (urgent alert) için mesaj.
Kopya kağıdı
Varsayılan trait uygulamalarını, impl bloğunda kendi uygulamanızı sağlayarak geçersiz kılabilirsiniz:
trait Greet {
fn greet(&self) -> String {
String::from("Hello there!")
}
}
struct Robot {
id: u32,
}
impl Greet for Robot {
fn greet(&self) -> String {
format!("BEEP BOOP. Unit {} online.", self.id)
}
}
let bot = Robot { id: 42 };
println!("{}", bot.greet()); // BEEP BOOP. Unit 42 online.
Özel bir davranışa ihtiyaç duymayan türler, varsayılan uygulamayı kabul etmek için boş bir impl bloğu kullanabilirken, özelleştirilmiş davranış gerektiren türler, belirli metotları aynı imzayla tanımlayarak geçersiz kılabilir.
Kendin dene
mod notifiable;
mod alerts;
use alerts::{GenericAlert, UrgentAlert};
use notifiable::Notifiable;
fn main() {
// Acil uyarı mesajı için girdiyi oku
let mut input = String::new();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let message = input.trim().to_string();
// TODO: Bir GenericAlert örneği oluştur
// TODO: Girdi mesajı ile bir UrgentAlert örneği oluştur
// TODO: GenericAlert'ten gelen bildirimi yazdır
// TODO: UrgentAlert'ten gelen bildirimi 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 Player