CodeBlanks Logo Icon CodeBlanks

Birden fazla impl

Bir struct için birden fazla impl bloğu yazmayı öğrenirsin.

Birden fazla impl

Bir tür için birden çok impl bloğu yazılabilir; derleyici hepsini birleştirir. Bu, kurucuları, hesapları ve yardımcıları ayrı gruplamak için kullanılır:

impl Kutu {
    fn new(en: u32, boy: u32) -> Self { Self { en, boy } }
}

impl Kutu {
    fn alan(&self) -> u32 { self.en * self.boy }
    fn kenar_toplami(&self) -> u32 { 2 * (self.en + self.boy) }
}

Ayrı bloklar özellikle trait uygulamalarında (impl Display for Kutu) ve generic koşullu uygulamalarda anlam kazanır.

Metotlar içinde metot çağırmak

Bir metot, aynı türün başka metotlarını self. ile çağırabilir; bu, farklı bloklardaki metotlar için de geçerlidir:

impl Kutu {
    fn kare_mi(&self) -> bool {
        self.en == self.boy
    }
    fn tanim(&self) -> String {
        let tur = if self.kare_mi() { "kare" } else { "dikdörtgen" };
        format!("{tur}, alan {}", self.alan())
    }
}

Uygulama İki blok

Birinci impl Kutu bloğunda new, ikinci blokta alan ve kenar_toplami (2 × (en + boy)) metotlarını yaz. Kutu::new(3, 4) için iki sonucu boşlukla ayırarak yazdır.

Başlangıç kodu

main.rs
struct Kutu {
    en: u32,
    boy: u32,
}

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
struct Kutu {
    en: u32,
    boy: u32,
}

impl Kutu {
    fn new(en: u32, boy: u32) -> Self {
        Self { en, boy }
    }
}

impl Kutu {
    fn alan(&self) -> u32 {
        self.en * self.boy
    }
    fn kenar_toplami(&self) -> u32 {
        2 * (self.en + self.boy)
    }
}

fn main() {
    let k = Kutu::new(3, 4);
    println!("{} {}", k.alan(), k.kenar_toplami());
}

Beklenen çıktı

12 14

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 İki ayrı <code>impl Kutu</code> bloğunda aynı adlı <code>alan</code> metodu olursa ne olur?

  • Derleme hatası: yinelenen tanım Doğru cevap
  • Sonraki öncekini ezer
  • İkisi de çağrılır
  • Aşırı yükleme (overload) olur

Açıklama: Rust'ta fonksiyon aşırı yükleme yoktur; aynı tür için aynı adlı iki ilişkili öğe E0592 hatasıdır.

2 Başka metodu çağır

Soru
fn tanim(&self) -> String {
    format!("alan {}", ____.alan())
}
Cevap
fn tanim(&self) -> String {
    format!("alan {}", self.alan())
}

Açıklama: Aynı örneğin başka metodu self üzerinden çağrılır.

3 Durum ve sonuç

Kavram Anlamı
İki impl Kutu bloğu Birleştirilir
Aynı adlı iki metot E0592
self.alan() İç çağrı
impl Display for Kutu Trait uygulaması

Başlangıç bölümündeki tüm dersler

16 Proje: Yapılacaklar listesi

  1. Görev modeli
  2. Ekleme
  3. Listeleme
  4. İşaretleme
  5. Komut okuma