CodeBlanks Logo Icon CodeBlanks

Generic metod

Generic struct için impl bloğu ve metot yazarsın.

Generic metod

Generic bir türe metot yazarken impl'den sonra da tür parametresi bildirilir. Bu metotlar her T için geçerlidir:

impl<T> Cift<T> {
    fn ilk(&self) -> &T {
        &self.a
    }
}

Yalnızca belirli bir somut tür için metot da yazılabilir; o zaman impl'de parametre yoktur:

impl Cift<f64> {
    fn ortalama(&self) -> f64 {
        (self.a + self.b) / 2.0
    }
}

Koşullu metotlar

Üçüncü bir seçenek, metodu trait sınırına bağlamaktır: yalnızca T belirli bir davranışa sahipse metot vardır:

use std::fmt::Display;

impl<T: Display + PartialOrd> Cift<T> {
    fn buyugu_yaz(&self) {
        if self.a >= self.b {
            println!("büyük: {}", self.a);
        } else {
            println!("büyük: {}", self.b);
        }
    }
}

Metot düzeyinde ayrı generic parametre de tanımlanabilir: fn karistir<U>(self, o: Cift<U>) -> Nokta<T, U>.

Uygulama Çift metotları

Cift<T> için her T'de çalışan fn ilk(&self) -> &T, yalnızca Cift<f64> için fn ortalama(&self) -> f64 yaz. Cift { a: 2.0, b: 5.0 } için iki sonucu boşlukla yazdır.

Başlangıç kodu

main.rs
struct Cift<T> {
    a: T,
    b: T,
}

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
struct Cift<T> {
    a: T,
    b: T,
}

impl<T> Cift<T> {
    fn ilk(&self) -> &T {
        &self.a
    }
}

impl Cift<f64> {
    fn ortalama(&self) -> f64 {
        (self.a + self.b) / 2.0
    }
}

fn main() {
    let c = Cift { a: 2.0, b: 5.0 };
    println!("{} {}", c.ilk(), c.ortalama());
}

Beklenen çıktı

2 3.5

Soru ve cevaplar

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

1 <code>Cift { a: 1, b: 2 }.ortalama()</code> derlenir mi? (<code>ortalama</code> yalnızca <code>Cift&lt;f64&gt;</code> için)

  • Evet, 1.5 döner
  • Evet, 1 döner
  • Çalışma anında hata
  • Hayır; Cift<i32> için ortalama tanımlı değil Doğru cevap

Açıklama: Somut türe yazılan impl yalnızca o türde görünür. Cift { a: 1.0, b: 2.0 } yazılırsa çalışır.

2 impl parametresi

Soru
impl____ Cift<T> {
    fn ilk(&self) -> &T {
        &self.a
    }
}
Cevap
impl<T> Cift<T> {
    fn ilk(&self) -> &T {
        &self.a
    }
}

Açıklama: Her T için geçerli metotlarda impl<T> yazılır.

3 impl biçimi ve kapsamı

Kavram Anlamı
impl<T> Cift<T> Her T
impl Cift<f64> Yalnızca f64
impl<T: Display> Cift<T> Display olan T
fn f<U>(..) Metoda özel tür

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