generated at
引数でのimpl Trait

genericsのsyntax sugar


rust
fn print_name(name: impl AsRef<str>) { println!("{}", name.as_ref()); }
これと同じ意味
rs
fn print_name<T: AsRef<str>>(name: T) { println!("{}", name.as_ref()); }
こう説明されるとめっちゃわかりやすいなmrsekut
AsRef<str> を実装している型なら何でも受け付けることを意味する
e.g. String , &str

これと同じことをdyn Traitでやるなら
fn print_name(name: &dyn AsRef<str>) になるが、
impl Trait は 静的ディスパッチ でオーバーヘッドが少ない



genericsより表現力が低い
impl Trait は関数ごとに独立して決定される
複数の impl Trait を受け取るとき、それらが同じ型かどうかを保証できない
rust
fn combine(a: impl Display, b: impl Display) { /* a と b が同じ型か不明 */ }
同じ型を強制するならジェネリクスを使う
rust
fn combine<T: Display>(a: T, b: T) { /* a と b は同じ型 */ }