impl Trait
は2つの利用方法があります:
- 引数の型
- リターン型
あなたの関数がジェネリックなトレイトを使用していて、特定の型を意識していない場合、impl Trait
を引数の型として利用して、関数宣言をシンプルにできます。
例えば、次のコードを考えてみましょう:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
parse_csv_document
はジェネリックなので、BufReadを実装する任意の型を取ることができます。
例えば、BufReader<File>
や[u8]
です。
R
がどんな型かは重要ではなく、src
の型宣言に使われているだけなので、この関数は以下のように書くこともできます:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
impl Trait
を引数の型として利用するということは、どのような形式の関数であるか明示できないので、注意してください。
例えば、parse_csv_document::<std::io::Empty>(std::io::empty())
は2番目の例では動作しません。
あなたの関数がMyTrait
を実装する型を返す場合、
リターン型を-> impl MyTrait
のように書けます。
これで型シグネチャをとてもシンプルにできます。
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
より重要なことに、Rustの型には書き表せないものがあるのです。
例えば、あらゆるクロージャは独自の無名な具象型を持ちます。
impl Trait
構文がない時は、クロージャを返すにはヒープ上に置かねばなりませんでした。
しかし今では次のようにすべて静的に行えます。
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
impl Trait
を使って、map
やfilter
クロージャを使うイテレータを返すこともできます。
おかげでmap
やfilter
を簡単に使えます。
クロージャ型は名前を持たないので、あなたの関数がクロージャを持つイテレータを返す場合、
明示的なリターン型を書くことはできません。
しかしimpl Trait
を使うことで簡単にできます:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX