CodeBlanks Logo Icon CodeBlanks

Özet - Trait sınırları

Trait bound ve where'i birleştirerek bir generic maksimum fonksiyonu yazarsın.

Trait sınırları özeti

Trait sınırı generic bir türün davranışını belirler: <T: Display>, birden çok sınır +, uzun sınırlar where. Parametrede impl Trait generic'in kısa yazımıdır; dönüşte adı gizli tek bir türü ifade eder. dyn Trait çalışma anı dağıtımıdır, farklı türleri aynı koleksiyonda tutar ve işaretçi arkasında kullanılır. Varsayılan seçim generic'tir; karışık koleksiyon ya da eklenti yapısı gerektiğinde dyn.

En büyük alanı bulmak

Trait nesneleri üzerinde yineleyici yöntemleri de kullanılabilir. f64 Ord olmadığı için max yerine fold ile en büyük bulunur:

fn en_buyuk_alan(v: &[Box<dyn Sekil>]) -> f64 {
    v.iter().map(|s| s.alan()).fold(0.0, f64::max)
}

f64::max, iki argüman alan bir fonksiyon olarak doğrudan fold'a verilebilir.

Uygulama En büyük alan

Önceki dersteki Sekil, Kare ve Daire tanımlarıyla fn en_buyuk_alan(v: &[Box<dyn Sekil>]) -> f64 yaz. Kare(2.0), Kare(3.0) ve Daire(1.0) içeren liste için sonucu {:.2} ile yazdır.

Başlangıç kodu

main.rs
trait Sekil {
    fn alan(&self) -> f64;
    fn ad(&self) -> String;
}

struct Kare(f64);
struct Daire(f64);

impl Sekil for Kare {
    fn alan(&self) -> f64 {
        self.0 * self.0
    }
    fn ad(&self) -> String {
        String::from("kare")
    }
}

impl Sekil for Daire {
    fn alan(&self) -> f64 {
        std::f64::consts::PI * self.0 * self.0
    }
    fn ad(&self) -> String {
        String::from("daire")
    }
}

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
trait Sekil {
    fn alan(&self) -> f64;
    fn ad(&self) -> String;
}

struct Kare(f64);
struct Daire(f64);

impl Sekil for Kare {
    fn alan(&self) -> f64 {
        self.0 * self.0
    }
    fn ad(&self) -> String {
        String::from("kare")
    }
}

impl Sekil for Daire {
    fn alan(&self) -> f64 {
        std::f64::consts::PI * self.0 * self.0
    }
    fn ad(&self) -> String {
        String::from("daire")
    }
}

fn en_buyuk_alan(v: &[Box<dyn Sekil>]) -> f64 {
    v.iter().map(|s| s.alan()).fold(0.0, f64::max)
}

fn main() {
    let v: Vec<Box<dyn Sekil>> = vec![Box::new(Kare(2.0)), Box::new(Kare(3.0)), Box::new(Daire(1.0))];
    println!("{:.2}", en_buyuk_alan(&v));
}

Beklenen çıktı

9.00

Soru ve cevaplar

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

1 <code>&amp;[Box&lt;dyn Sekil&gt;]</code> alan bir fonksiyona <code>Vec&lt;Box&lt;dyn Sekil&gt;&gt;</code> nasıl verilir?

  • &v ile Doğru cevap
  • v ile
  • v.into()
  • Verilemez

Açıklama: &Vec<T>, &[T]'ye otomatik dönüşür (deref coercion).

2 Katlayarak en büyük

Soru
v.iter().map(|s| s.alan()).____(0.0, f64::max)
Cevap
v.iter().map(|s| s.alan()).fold(0.0, f64::max)

Açıklama: fold başlangıç değeriyle her elemanı birleştirir; f64::max ile en büyüğü bulur.

3 Grubun özeti

Kavram Anlamı
<T: A + B> Çoklu sınır
where Okunur sınırlar
-> impl Trait Gizli tek tür
Box<dyn Trait> Dinamik dağıtım

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