Varsayılan metot
- Rust kursu
- Orta seviye
- Ders 3/115
- 4 dk
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.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
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());
}Beklenen çıktı
Merhaba, ben R2 Selam! Ben Ece.
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 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 Doğru cevap
- Evet, super.selam() ile
- Evet, Tanit::selam ile her zaman
Açıklama: Rust'ta kalıtım yoktur; ezilen metot varsayılan gövdeye erişemez. Ortak kodu ayrı bir yardımcı fonksiyona koymak gerekir.
2 Diğer metodu çağır
fn selam(&self) -> String {
format!("Merhaba, ben {}", ____.ad())
}
fn selam(&self) -> String {
format!("Merhaba, ben {}", self.ad())
}
Açıklama: Varsayılan metot, aynı örneğin diğer trait metotlarını self ile çağırır.
3 Durum ve sonuç
| Kavram | Anlamı |
|---|---|
Robot.selam() |
Varsayılan gövde |
Insan.selam() |
Ezilmiş gövde |
Iterator::next |
Zorunlu metot |
Iterator::map |
Varsayılan metot |