CodeBlanks Logo Icon CodeBlanks

Varsayılan metot

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

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

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

Soru
fn selam(&self) -> String {
    format!("Merhaba, ben {}", ____.ad())
}
Cevap
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

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