Birden fazla trait
- Rust kursu
- Orta seviye
- Ders 5/115
- 4 dk
Bir tür için birden fazla trait uygularsın.
Birden fazla trait
Bir tür istediği kadar trait uygulayabilir. Bir parametre birden çok davranış istiyorsa trait'ler + ile birleştirilir:
use std::fmt::Display;
fn rapor(x: &(impl Display + Ozet)) -> String {
format!("{x} ({})", x.ozet())
}Burada x hem {} ile yazdırılabilir (Display) hem de ozet() metoduna sahip olmalıdır. Parantez, &'in iki trait'e birlikte uygulanması için gereklidir.
Display ve özel trait birlikte
Bir puan türü hem yazdırılabilir hem de kendini özetleyebilir:
struct Puan(u32);
impl Display for Puan {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{} puan", self.0)
}
}
impl Ozet for Puan {
fn ozet(&self) -> String {
if self.0 > 50 { "yüksek".into() } else { "düşük".into() }
}
}Uygulama Puan raporu
Ozet trait'ini ve struct Puan(u32); türünü yaz; Puan için Display ("N puan") ve Ozet (50'den büyükse "yüksek", değilse "düşük") uygula. fn rapor(x: &(impl Display + Ozet)) -> String ile Puan(80) ve Puan(20) raporlarını ayrı satırlara yazdır.
Başlangıç kodu
use std::fmt::Display;
fn main() {
// buraya yaz
}Örnek çözüm
use std::fmt::Display;
trait Ozet {
fn ozet(&self) -> String;
}
struct Puan(u32);
impl Display for Puan {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{} puan", self.0)
}
}
impl Ozet for Puan {
fn ozet(&self) -> String {
if self.0 > 50 {
"yüksek".into()
} else {
"düşük".into()
}
}
}
fn rapor(x: &(impl Display + Ozet)) -> String {
format!("{x} ({})", x.ozet())
}
fn main() {
println!("{}", rapor(&Puan(80)));
println!("{}", rapor(&Puan(20)));
}Beklenen çıktı
80 puan (yüksek) 20 puan (düşük)
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 İki trait'te aynı adlı <code>ad()</code> metodu varsa ve tür ikisini de uygularsa, belirli birini nasıl çağırırsın?
- x.ad() her zaman ilkini seçer
- Mümkün değil
- x.ad::<Trait>()
- TraitAdı::ad(&x) ile tam yol Doğru cevap
Açıklama: Belirsizlikte derleyici hata verir (E0034); Trait::metot(&x) ya da <T as Trait>::metot(&x) ile hangisinin kastedildiği söylenir.
2 İki davranış iste
fn rapor(x: &(impl Display ____ Ozet)) -> String {
format!("{x} ({})", x.ozet())
}
fn rapor(x: &(impl Display + Ozet)) -> String {
format!("{x} ({})", x.ozet())
}
Açıklama: Trait sınırları + ile birleştirilir.
3 Puan ve rapor sonucu
| Kavram | Anlamı |
|---|---|
Puan(80) |
80 puan (yüksek) |
Puan(20) |
20 puan (düşük) |
Puan(51) |
51 puan (yüksek) |
Puan(50) |
50 puan (düşük) |