Zum Inhalt springen

Trait-Objekte

use std::fmt::Debug;
fn main() {
let n = 1;
let s = String::from("Hello");
let v: Vec<&dyn Debug> = vec![&n, &s];
let n_ref = v[0] as &i32;
println!("{}", n_ref + 1);
}

Im Gegensatz zu einigen OOP-Sprachen kann ein Trait-Objekt nicht auf einen konkreteren Typ „heruntergecastet“ werden (außer im Fall des Any-Traits).


Betrachten Sie die Implementierung einer generischen Funktion auf zwei Arten:

fn f_opt1<T: SomeTrait>(t: &T) { /* ... */ }
fn f_opt2(t: &dyn SomeTrait) { /* ... */ }

Welche der folgenden Gründe sprechen in den meisten Fällen dafür, die Trait-Objekt-Version (f_opt2) der typ-parametrischen Version (f_opt1) vorzuziehen? Wählen Sie alle zutreffenden Optionen aus.

Durch die Vermeidung von Monomorphisierung führen Trait-Objekt-Funktionen sowohl zu schnelleren Kompilierzeiten als auch zu kleineren Binärdateien. Dies geht jedoch in der Regel auf Kosten der Laufzeitleistung. Trait-Objekte sind für Entwickler selten einfacher zu handhaben als Trait-gebundene Generics.