CodeBlanks Logo Icon CodeBlanks

Birden fazla trait

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

main.rs
use std::fmt::Display;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
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

Soru
fn rapor(x: &(impl Display ____ Ozet)) -> String {
    format!("{x} ({})", x.ozet())
}
Cevap
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)

Orta seviye bölümündeki tüm dersler