Rust
Varsayılan metot
Trait'te varsayılan metot tanımlamayı öğrenirsin.
Varsayılan metot
Trait metotları varsayılan bir gövdeye sahip olabilir. Uygulayan tür onu olduğu gibi kullanabilir ya da kendi sürümüyle ezebilir (override). Varsayılan metotlar, aynı trait'in diğer metotlarını çağırabilir:
trait Tanit {
fn ad(&self) -> String;
fn selam(&self) -> String {
format!("Merhaba, ben {}", self.ad())
}
}
Böylece uygulayan türün yalnızca ad'ı yazması yeter; selam ücretsiz gelir.
Ezme örneği
İki tür aynı trait'i uygular; biri varsayılanı kullanır, diğeri ezer:
struct Robot;
struct Insan { ad: String }
impl Tanit for Robot {
fn ad(&self) -> String { String::from("R2") }
}
impl Tanit for Insan {
fn ad(&self) -> String { self.ad.clone() }
fn selam(&self) -> String {
format!("Selam! Ben {}.", self.ad)
}
}
Standart kütüphanede Iterator en iyi örnektir: yalnızca next yazılır, map, filter, sum gibi onlarca metot varsayılan olarak gelir.
Uygulama Tanıtım
Yukarıdaki Tanit trait'ini, Robot (varsayılanı kullanır, ad "R2") ve Insan (selam'ı ezer) türlerini yaz. Robot.selam() ve Insan { ad: "Ece".to_string() }.selam() sonuçlarını ayrı satırlara yazdır.
Örnek çözümü göster
trait Tanit {
fn ad(&self) -> String;
fn selam(&self) -> String {
format!("Merhaba, ben {}", self.ad())
}
}
struct Robot;
struct Insan {
ad: String,
}
impl Tanit for Robot {
fn ad(&self) -> String {
String::from("R2")
}
}
impl Tanit for Insan {
fn ad(&self) -> String {
self.ad.clone()
}
fn selam(&self) -> String {
format!("Selam! Ben {}.", self.ad)
}
}
fn main() {
println!("{}", Robot.selam());
println!("{}", Insan { ad: "Ece".to_string() }.selam());
}
Kendini test et
-
Ezilmiş (override) bir metottan varsayılan sürüm çağrılabilir mi?
- Yalnızca generic türlerde
- Hayır; ezilen sürüm varsayılanın yerini tamamen alır
- Evet, super.selam() ile
- Evet, Tanit::selam ile her zaman
Cevabı göster
Hayır; ezilen sürüm varsayılanın yerini tamamen alır — Rust'ta kalıtım yoktur; ezilen metot varsayılan gövdeye erişemez. Ortak kodu ayrı bir yardımcı fonksiyona koymak gerekir.
-
Diğer metodu çağır
fn selam(&self) -> String {
format!("Merhaba, ben {}", ____.ad())
}
Cevabı göster
fn selam(&self) -> String {
format!("Merhaba, ben {}", self.ad())
}
-
Durum ve sonuç
- Robot.selam()
- Varsayılan gövde
- Insan.selam()
- Ezilmiş gövde
- Iterator::next
- Zorunlu metot
- Iterator::map
- Varsayılan metot
Sıradaki ders: Trait ve parametre