この記事は Rustその2 Advent Calendar 2018 の 21日目の記事です。 はじめに 先日、auto_enumsというクレートをリリースしたのですが、このクレートを作った背景を中心に、auto_enumsがどのような問題を解決できるのかについても書こうと思います。 背景 impl Traitについて impl TraitはRust 1.26で安定化された機能で、関数の引数と、トレイトメソッド以外の関数の戻り値に使用でき、引数位置で使用された場合は匿名の型引数に、戻り値位置で使用された場合は存在型になります。 impl Traitを使用するとクロージャのような匿名の型や、IteratorやFutureなどを使用した際に生成される複雑な型を簡潔に書くことができるようになります。また、静的ディスパッチになるのでBox<dyn Trait>よりもパフォーマンスが良くなります。
![Rustで複数のimpl Traitを返す - Qiita](https://cdn-ak-scissors.b.st-hatena.com/image/square/e9f61eaa283097e96eb5245005837e3b5b75c01c/height=288;version=1;width=512/https%3A%2F%2Fqiita-user-contents.imgix.net%2Fhttps%253A%252F%252Fcdn.qiita.com%252Fassets%252Fpublic%252Fadvent-calendar-ogp-background-f625e957b80c4bd8dd47b724be996090.jpg%3Fixlib%3Drb-4.0.0%26w%3D1200%26mark64%3DaHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZoPTMzNiZ0eHQ9UnVzdCVFMyU4MSVBNyVFOCVBNCU4NyVFNiU5NSVCMCVFMyU4MSVBRWltcGwlMjBUcmFpdCVFMyU4MiU5MiVFOCVCRiU5NCVFMyU4MSU5OSZ0eHQtY29sb3I9JTIzM0EzQzNDJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnR4dC1jbGlwPWVsbGlwc2lzJnR4dC1hbGlnbj1sZWZ0JTJDbWlkZGxlJnM9ZTRhYzliNzU0YTUwMjBjNWJlNmY1ZmYxMzY2OTgzNWQ%26mark-x%3D142%26mark-y%3D151%26blend64%3DaHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTYxNiZ0eHQ9JTQwdGFpa2ktZSZ0eHQtY29sb3I9JTIzM0EzQzNDJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTM2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9ZTc5MzFhOTVkODc2NjBiOGU4MzE5ZTc2YzIwMjVjODg%26blend-x%3D142%26blend-y%3D491%26blend-mode%3Dnormal%26s%3Df4ffa045b4a53bf7c59caa0141d9227c)