⚡ 1. Statischer Dispatch vs. Dynamischer Dispatch (dyn Trait)
Rust bietet zwei grundlegende Wege für Polymorphie. Die Wahl hat entscheidenden Einfluss auf Performance, Inlining und Typsystem:
└── Monomorphisierung zur Compile-Zeit ──> Direkter Funktionsaufruf (Zero-Cost, Inlining!)
[2. Dynamischer Dispatch: Box<dyn Plugin> / &dyn Plugin]
└── Fat Pointer: [ Pointer auf Instanz | Pointer auf vtable (Methodentabelle) ]
└── Ermöglicht heterogene Sammlungen: Vec<Box<dyn Plugin>>
Compiler erzeugt spezialisierten Maschinencode für jeden Typ (Monomorphisierung). Maximale Geschwindigkeit, jedoch homogene Collections.
Laufzeit-Auflösung über vtable. Geringer Indirektions-Overhead, erlaubt aber heterogene Listen wie Vec<Box<dyn DataPlugin>>.
📦 2. Trait Objects in der Praxis
pub trait DataPlugin {
fn name(&self) -> &str;
fn process(&self, input: &str) -> String;
}
pub struct PluginPipeline {
// Heterogene Sammlung unterschiedlicher Plugin-Typen!
plugins: Vec<Box<dyn DataPlugin>>,
}
impl PluginPipeline {
pub fn new() -> Self {
Self { plugins: Vec::new() }
}
pub fn register(&mut self, plugin: Box<dyn DataPlugin>) {
self.plugins.push(plugin);
}
pub fn run_all(&self, mut data: String) -> String {
for plugin in &self.plugins {
data = plugin.process(&data);
}
data
}
}
📑 3. Cheat-Sheet: Generics & dyn Trait
| Muster | Syntax | Dispatch-Art | Typ-Sicherheit |
|---|---|---|---|
| Generische Funktion | fn f<T: Trait>(x: T) |
Statisch (Compile-Zeit) | 100% homogen pro Aufruf |
| impl Trait Parameter | fn f(x: impl Trait) |
Statisch (Kurzform) | Homogen |
| Trait Object Referenz | &dyn Trait |
Dynamisch (vtable) | Heterogen (Borrow) |
| Owned Trait Object | Box<dyn Trait> |
Dynamisch (Heap + vtable) | Heterogen (Ownership) |
🧠 Diagnostischer Selbst-Check
Überprüfe dein Verständnis von Ownership, Borrowing und Typensicherheit, bevor du die Übung in der Web-IDE bearbeitest.