Özet - Trait sınırları
- Rust kursu
- Orta seviye
- Ders 24/115
- 5 dk
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
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
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>&[Box<dyn Sekil>]</code> alan bir fonksiyona <code>Vec<Box<dyn Sekil>></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
v.iter().map(|s| s.alan()).____(0.0, f64::max)
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 |