Varsayılanları Geçersiz Kılma
Coddy'nin Rust Journey'sinin Nesne Yönelimli Programlama 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 durumda, impl bloğunda kendi uygulamanızı sağlayarak varsayılanı geçersiz kılabilirsiniz.
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 varsayılan bir greet yöntemi 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ına gerek yoktur; özel davranışa ihtiyaç duyan türler ise yalnızca ilgilendikleri yöntemleri geçersiz kılabilir. Trait, onu uygulayan her türün bu yönteme sahip olmasını yine de garanti eder.
Görev
KolayFarklı uyarı türlerinin mesajlarını özelleştirebildiği bir bildirim sistemi oluşturalım! Varsayılan bir uygulamaya sahip bir trait oluşturacak, ardından bir türün varsayılanı kullanmasını ve diğerinin bunu özel davranışla geçersiz kılmasını sağlayacaksın.
Kodunu üç dosyaya ayıracaksın:
notifiable.rs: Varsayılan uygulamaya sahipNotifiablemetodunu içeren herkese açık birnotify(&self) -> Stringtrait'i tanımla; bu varsayılan uygulama"Alert: Something happened!"döndürür.alerts.rs: Trait'ini farklı şekillerde uygulayan iki herkese açık struct oluştur:GenericAlert: varsayılan bildirimi kullanan bir birim struct'ı (boş impl bloğu)UrgentAlert: herkese açık birmessagealanına (String) sahip bir struct; varsayılanı geçersiz kılarak"URGENT: {message}"değerinin saklanan mesajı olduğu{message}ifadesini döndürür
main.rs: Modüllerini bir araya getir ve her iki davranışı göster. Sağlanan girdiyi kullanarak birGenericAlertve birUrgentAlertoluştur, ardından bildirimlerini yazdır.
Buradaki temel fikir, GenericAlert'ın varsayılan uygulamadan ücretsiz olarak yararlanması, UrgentAlert'ın ise kendi impl bloğunda metodu tanımlayarak özelleştirilmiş sürümünü sağlamasıdır.
Çıktın şu biçimi izlemelidir:
Alert: Something happened!
URGENT: {message}Örneğin, girdi Server is down! olduğunda:
Alert: Something happened!
URGENT: Server is down!Bir girdi alacaksın: acil uyarının mesajı.
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.
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