Birden fazla impl
- Rust kursu
- Başlangıç
- Ders 75/115
- 4 dk
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
struct Kutu {
en: u32,
boy: u32,
}
fn main() {
// buraya yaz
}Örnek çözüm
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
fn tanim(&self) -> String {
format!("alan {}", ____.alan())
}
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ı |