⚡ Lehrpfad 3: Traits, Generics & Smart Pointer

Rust 10: Generics & Trait Objects (dyn Trait)

Verstehe den Unterschied zwischen statischem Dispatch (Monomorphisierung) und dynamischem Dispatch (dyn Trait) mit vtables für flexible Plugin-Architekturen.

📂 Dateien dieser Lerneinheit:
📄 aufgabe.rs (Startercode) 🧪 test_aufgabe.rs (Tests) 💡 musterloesung.rs (Lösung) 📖 README.md

⚡ 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:

[1. Statischer Dispatch: fn run<T: Plugin>(p: &T)]
    └── 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>>
🚀 Statischer Dispatch (Generics)

Compiler erzeugt spezialisierten Maschinencode für jeden Typ (Monomorphisierung). Maximale Geschwindigkeit, jedoch homogene Collections.

🧩 Dynamischer Dispatch (dyn Trait)

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.

🎯 Aufgaben & Checkliste in aufgabe.rs

💻 In Web-IDE öffnen → ← Zurück zu Rust 09 Weiter zu Rust 11: Iteratoren →