CodeBlanks Logo Icon CodeBlanks

Trait uygulama

impl Trait for Type ile bir trait'i uygularsın.

Trait uygulama

Aynı trait birçok türe uygulanabilir; her biri davranışı kendine göre tanımlar:

trait Alan {
    fn alan(&self) -> f64;
}

struct Kare { a: f64 }
struct Daire { r: f64 }

impl Alan for Kare {
    fn alan(&self) -> f64 { self.a * self.a }
}
impl Alan for Daire {
    fn alan(&self) -> f64 { std::f64::consts::PI * self.r * self.r }
}

Standart kütüphanenin trait'leri de kendi türlerine uygulanabilir: impl std::fmt::Display for Kare.

Display uygulamak

{} ile yazdırmak için std::fmt::Display uygulanır. Tek metodu fmt'dir ve write! ile biçimlendiriciye yazar:

use std::fmt;

impl fmt::Display for Kare {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "Kare({})", self.a)
    }
}

println!("{}", Kare { a: 3.0 });   // Kare(3)

Display uygulayan her tür ücretsiz olarak to_string() metodunu da kazanır.

Uygulama İki şekil

trait Alan tanımla ve onu Kare { a: f64 } ile Daire { r: f64 } türlerine uygula. Kare { a: 3.0 } ve Daire { r: 2.0 } alanlarını {:.2} ile boşlukla yazdır.

Başlangıç kodu

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

Örnek çözüm

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

struct Kare {
    a: f64,
}

struct Daire {
    r: f64,
}

impl Alan for Kare {
    fn alan(&self) -> f64 {
        self.a * self.a
    }
}

impl Alan for Daire {
    fn alan(&self) -> f64 {
        std::f64::consts::PI * self.r * self.r
    }
}

fn main() {
    println!("{:.2} {:.2}", Kare { a: 3.0 }.alan(), Daire { r: 2.0 }.alan());
}

Beklenen çıktı

9.00 12.57

Soru ve cevaplar

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

1 Yetim kuralı (orphan rule) neyi yasaklar?

  • Kendi trait'ini String'e uygulamayı
  • Display uygulamayı
  • Hem trait'in hem türün başka crate'lerden geldiği uygulamaları Doğru cevap
  • Bir türe iki trait uygulamayı

Açıklama: impl Display for Vec<i32> yazamazsın; ikisi de std'den gelir. Trait ya da türden en az biri senin crate'inde olmalı.

2 Biçimlendiriciye yaz

Soru
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
    ____(f, "Kare({})", self.a)
}
Cevap
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
    write!(f, "Kare({})", self.a)
}

Açıklama: write! biçimlenmiş metni verilen hedefe yazar ve fmt::Result döndürür.

3 Uygulama ve izin

Kavram Anlamı
impl Alan for Kare İzinli (ikisi de senin)
impl Display for Kare İzinli (tür senin)
impl Alan for String İzinli (trait senin)
impl Display for Vec<i32> Yasak (yetim kuralı)

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