Zum Inhalt springen

Traits

use std::fmt::Display;
fn displayable<T: Display>(t: T) -> impl Display { t }
fn main() {
let s = String::from("hello");
let mut s2 = displayable(s);
s2.push_str(" world");
println!("{s2}");
}

Weil displayable impl Display zurückgibt, wissen wir nur, dass s2 ein Typ ist, der Display implementiert, nicht dass es ein String ist, der eine push_str-Methode besitzt. Daher können wir s2.push_str(..) nicht aufrufen. Wenn der Rückgabetyp von displayable -> T wäre, würde dieses Programm kompilieren.


Welches ist die kleinste Menge von Trait-Grenzen für T, die benötigt wird, damit diese Funktion typgeprüft wird?

fn f<T: /* ??? */>(t: &T) {
let t2 = t.clone();
println!("{t2}");
}

Da clone aufgerufen wird und die {}-Anzeige-Klammern in einem Formatierer verwendet werden, muss T Clone und Display implementieren.