Avatar ·

Was ist ein trait object in Rust und wie erstellt man es?

Hallo zusammen! Ich lerne seit kurzem Rust und versuche, mich mit Traits auseinanderzusetzen. Ich habe die Dokumentation gelesen, aber das Konzept des "trait object" bleibt für mich unklar. \n\nHier ist ein einfacher Trait, den ich habe:\n\n```rust\ntrait Animal {\n fn speak(&self);\n}\n\nstruct Dog;\nimpl Animal for Dog {\n fn speak(&self) {\n println!(\"Woof!\");\n }\n}\n\nstruct Cat;\nimpl Animal for Cat {\n fn speak(&self) {\n println!(\"Meow!\");\n }\n}\n```\n\nIch möchte einen Vektor erstellen, der verschiedene Tiere speichert – sowohl Dog als auch Cat. Aber wenn ich `Vec` schreibe, beschwert sich der Compiler, dass Animal ein Trait und kein Typ ist. Im Internet wird empfohlen, `Box` zu verwenden, aber ich verstehe nicht, was dieses `dyn` ist und warum es ohne nicht geht.\n\nBitte erklärt mir:\n1. Was ist ein trait object in einfachen Worten?\n2. Wie funktioniert es unter der Haube?\n3. Warum muss man `dyn` schreiben und was bedeutet es?\n4. Welche Einschränkungen haben trait objects?\n\nDanke!\n<<>>\n

Was ist ein trait object?

\n

Ein trait object (Objekt-Trait) ist eine Möglichkeit, Werte verschiedener Typen, die denselben Trait implementieren, über einen gemeinsamen Zeiger zu verwalten. Es erlaubt dynamische Polymorphie, ähnlich wie Schnittstellen in anderen Sprachen.