Trait uygulama
- Rust kursu
- Orta seviye
- Ders 2/115
- 4 dk
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
fn main() {
// buraya yaz
}Örnek çözüm
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
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
____(f, "Kare({})", self.a)
}
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ı) |