β‘ 1. Was sind Traits?
Ein Trait (vergleichbar mit Interfaces in Java oder C#, aber deutlich mΓ€chtiger) definiert gemeinsame FunktionalitΓ€t, die verschiedene Datentypen teilen kΓΆnnen. Ein Trait beschreibt Methoden-Signaturen, die implementierende Typen bereitstellen mΓΌssen.
β trait TelemetryReport β
ββββββββββββββββββββββββββββββββββββ€
β + summary(&self) -> String β
β + severity_level(&self) -> u8 β (Default: 1)
β + is_critical(&self) -> bool β (Default: sev >= 8)
ββββββββββββββββββ¬ββββββββββββββββββ
β impl Trait for Type
ββββββββββββββββββ΄βββββββββββββββββ
βΌ βΌ
βββββββββββββββββββββββββ βββββββββββββββββββββββββ
β struct CpuMetric β β struct DiskAlert β
β usage_percent: f64 β β device: String β
β core_id: usize β β free_space_gb: u32 β
βββββββββββββββββββββββββ βββββββββββββββββββββββββ
pub trait Summary {
// Erforderliche Methode
fn summarize(&self) -> String;
// Methode mit Default-Implementierung
fn is_highlighted(&self) -> bool {
false
}
}
pub struct NewsArticle {
pub headline: String,
pub author: String,
}
impl Summary for NewsArticle {
fn summarize(&self) -> String {
format!("{}: {}", self.headline, self.author)
}
}
π‘οΈ 2. Trait Bounds & Mehrfach-EinschrΓ€nkungen
Mit Trait Bounds legst du fest, dass ein generischer Typ bestimmte Eigenschaften aufweisen muss. Mehrere Bounds werden mit + kombiniert:
impl Trait
Kompakt fΓΌr einfache Parameter: fn notify(item: &impl Summary)
Erzwingt gleiche Typen: fn notify<T: Summary + Display>(item: &T)
where Clauses
ErhΓΆht Lesbarkeit bei vielen Typ-Parametern und komplexen Bounds.
// Mehrere Bounds mit 'where' Klausel
fn process_telemetry<T, U>(report: &T, target: &U) -> String
where
T: Summary + Clone,
U: std::fmt::Display,
{
format!("Sende Report [{}] an Target [{}]", report.summarize(), target)
}
π 3. Cheat-Sheet: Traits & Best Practices
| Konzept | Syntax / Rust-Code | Bedeutung |
|---|---|---|
| Trait Definition | pub trait Describable { fn desc(&self) -> String; } |
Definiert gemeinsame Methodensignaturen |
| Default Implementation | fn is_ok(&self) -> bool { true } |
Kann bei Bedarf im impl ΓΌberschrieben werden |
| Mehrfach-Bounds | T: Summary + Clone + Send |
Typ muss alle angegebenen Traits erfΓΌllen |
Return impl Trait |
fn create_reporter() -> impl Summary |
Kapselt den konkreten Typ vor dem Aufrufer |
π§ Diagnostischer Selbst-Check
ΓberprΓΌfe dein VerstΓ€ndnis von Ownership, Borrowing und Typensicherheit, bevor du die Γbung in der Web-IDE bearbeitest.
π― Aufgaben & Checkliste in aufgabe.rs
In Rust kannst du einen Trait nur fΓΌr einen Typen implementieren, wenn entweder der Trait oder der Typ in deiner eigenen Crate definiert ist. Das verhindert Namenskonflikte und sorgt fΓΌr StabilitΓ€t im Γkosystem!