capypad
0 Tage Serie
rust / expert
Snippet

Objekt-Sicherheit und Vtable-Beschränkungen

Nicht alle Traits können als dynamische Trait-Objekte (dyn Trait) verwendet werden. Damit ein Trait 'objekt-sicher' ist, darf er keine generischen Methoden haben. Man kann die Objekt-Sicherheit jedoch bewahren, indem man 'where Self: Sized' zu spezifischen Methoden hinzufügt, wodurch diese aus der Vtable ausgeschlossen werden.

snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
trait AdvancedPlugin {
fn execute(&self);
// This method makes the trait NOT object-safe if called on a Trait Object
fn generic_helper<T>(&self, _data: T) where Self: Sized;
}
 
fn run_plugins(plugins: &[Box<dyn AdvancedPlugin>]) {
for p in plugins {
p.execute();
// p.generic_helper(42); // Error: cannot call generic method on dyn trait
}
}
Erklärung
1
dyn AdvancedPlugin
Repräsentiert ein Trait-Objekt mit dynamischem Dispatch über eine Vtable.
2
where Self: Sized
Ein Constraint, das verhindert, dass diese Methode in die dynamische Vtable aufgenommen wird.
3
Box<dyn AdvancedPlugin>
Heap-allokierter Zeiger auf einen Typ, der den Trait implementiert, nützlich für heterogene Listen.