Supertrait
- Rust kursu
- İleri seviye
- Ders 63/81
- 4 dk
Supertrait ile bir trait'e başka trait sınırı koyarsın.
Supertrait
Bir trait başka bir trait'e bağımlı olabilir: trait A: B, "A'yı uygulayan her tür B'yi de uygulamalıdır" demektir. A'nın varsayılan metotları B'nin metotlarını kullanabilir:
use std::fmt::Display;
trait Raporlanir: Display {
fn rapor(&self) -> String {
format!("[rapor] {self}") // Display sayesinde
}
}
struct Sicaklik(f64);
impl Display for Sicaklik {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{}°C", self.0)
}
}
impl Raporlanir for Sicaklik {}Bu kalıtım değildir: üst trait'in uygulaması ayrıca yazılır, yalnızca varlığı zorunlu kılınır.
Neden yararlı?
Üst trait'ler, bir trait'in ihtiyaç duyduğu yetenekleri tek yerde toplar. Örneğin std::error::Error: Debug + Display'dir; her hata türü otomatik olarak yazdırılabilir. Eq: PartialEq, Ord: Eq + PartialOrd, Copy: Clone standart kütüphanedeki diğer örneklerdir.
fn hepsini_raporla(v: &[&dyn Raporlanir]) {
for x in v {
println!("{}", x.rapor()); // Display'e de erişim var
}
}Uygulama Raporlanabilir sıcaklık
Yukarıdaki Raporlanir trait'ini ve Sicaklik türünü (Display: {}°C) yaz. Sicaklik(21.5).rapor() sonucunu yazdır.
Başlangıç kodu
use std::fmt::{self, Display};
fn main() {
// buraya yaz
}Örnek çözüm
use std::fmt::{self, Display};
trait Raporlanir: Display {
fn rapor(&self) -> String {
format!("[rapor] {self}")
}
}
struct Sicaklik(f64);
impl Display for Sicaklik {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}°C", self.0)
}
}
impl Raporlanir for Sicaklik {}
fn main() {
println!("{}", Sicaklik(21.5).rapor());
}Beklenen çıktı
[rapor] 21.5°C
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Display uygulamayan bir türe <code>impl Raporlanir for X {}</code> yazılırsa ne olur?
- E0277: X Display uygulamıyor Doğru cevap
- Display otomatik üretilir
- Çalışır
- Uyarı
Açıklama: Üst trait sınırı, alt trait uygulamasının ön koşuludur.
2 Üst trait
trait Raporlanir____ {
fn rapor(&self) -> String {
format!("[rapor] {self}")
}
}
trait Raporlanir: Display {
fn rapor(&self) -> String {
format!("[rapor] {self}")
}
}
Açıklama: trait A: B, A'yı uygulayanların B'yi de uygulamasını şart koşar.
3 Trait ve üst trait'i
| Kavram | Anlamı |
|---|---|
Error |
Debug + Display |
Eq |
PartialEq |
Copy |
Clone |
Ord |
Eq + PartialOrd |