引数でのimpl Trait
genericsのsyntax sugar
例
rustfn print_name(name: impl AsRef<str>) {
println!("{}", name.as_ref());
}
これと同じ意味
rsfn print_name<T: AsRef<str>>(name: T) {
println!("{}", name.as_ref());
}
こう説明されるとめっちゃわかりやすいな

AsRef<str>
を実装している型なら何でも受け付けることを意味する
e.g. String
, &str
fn print_name(name: &dyn AsRef<str>)
になるが、
impl Trait
は 静的ディスパッチ でオーバーヘッドが少ない
genericsより表現力が低い
impl Trait
は関数ごとに独立して決定される
複数の impl Trait
を受け取るとき、それらが同じ型かどうかを保証できない
rustfn combine(a: impl Display, b: impl Display) { /* a と b が同じ型か不明 */ }
同じ型を強制するならジェネリクスを使う
rustfn combine<T: Display>(a: T, b: T) { /* a と b は同じ型 */ }