CodeBlanks Logo Icon CodeBlanks

Supertrait

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

main.rs
use std::fmt::{self, Display};

fn main() {
    // buraya yaz
}

Örnek çözüm

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

Soru
trait Raporlanir____ {
    fn rapor(&self) -> String {
        format!("[rapor] {self}")
    }
}
Cevap
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

İleri seviye bölümündeki tüm dersler