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.
default implementation kullanışlıdır, ancak bazen bir türün standarttan farklı bir davranışa ihtiyacı olur. Bu gerçekleştiğinde, impl bloğunda kendi implementation'ınızı sağlayarak default'u override edebilirsiniz.
Yöntemi aynı imzayla tanımlayın, ancak özel mantığınızı ekleyin:
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 bir default greet method'u sağlasa da, Robot onu tamamen kendi sürümüyle değiştirir. Bir Robot üzerinde greet() çağırdığında Rust, özel implementation'ı kullanır:
let bot = Robot { id: 42 };
println!("{}", bot.greet()); // BEEP BOOP. Birim 42 çevrimiçi.
Bu sana esneklik sağlar: default ile uyumlu olan türlerin hiçbir şey yazmasına gerek yoktur; özel davranışa ihtiyaç duyan türler ise yalnızca önemsedikleri method'ları override edebilir. trait yine de her uygulayan türün method'u kullanılabilir durumda bulundurmasını garanti eder.
Görev
KolayFarklı alert türlerinin mesajlarını özelleştirebildiği bir notification system oluşturalım! default implementation içeren bir trait oluşturacak, ardından bir türün default olanı kullanmasını, diğerinin ise bunu custom behavior ile override etmesini sağlayacaksın.
Code'unu üç dosyaya ayıracaksın:
notifiable.rs: Bir publicNotifiabletrait'i ve default implementation'a sahip,"Alert: Something happened!"döndüren birnotify(&self) -> Stringmethod'u Define et.alerts.rs: trait'ini farklı şekilde implement eden iki public struct Create et:GenericAlert: default notification kullanan bir unit struct (empty impl block)UrgentAlert: public birmessagefield'ına (String) sahip olan ve{message}değerinin stored message olduğu durumda, default'u"URGENT: {message}"döndürecek şekilde override eden bir struct
main.rs: module'lerini bir araya getir ve her iki behavior'ı da göster. Input kullanarak birGenericAlertve birUrgentAlertCreate et, ardından notification'larını Print et.
Buradaki temel içgörü, GenericAlert'ın default sayesinde ücretsiz behavior elde etmesi, UrgentAlert'ın ise method'u kendi impl block'unda Define ederek kendi specialized version'ını sağlamasıdır.
Output'un şu formatı izlemesi gerekir:
Alert: Something happened!
URGENT: {message}Örneğin, Server is down! input'u ile:
Alert: Something happened!
URGENT: Server is down!Bir input alacaksın: urgent alert için message.
Kendin dene
mod notifiable;
mod alerts;
use alerts::{GenericAlert, UrgentAlert};
use notifiable::Notifiable;
fn main() {
// Acil uyarı mesajı için girişi 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ıyla bir UrgentAlert örneği oluştur
// TODO: GenericAlert'ten bildirimi yazdır
// TODO: UrgentAlert'ten 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 PlayerKendi başına pratik yap: Online Rust derleyicisi