Rust stableでクロージャの返り値型を短くする

1 min read読了の目安(約1000字

名前が長すぎるtraitを短くしたい

Rustを使っているときに、

Fn(i64, MyType<T>, bool, usize) -> (
    MyType<T>,
    i64,
    Vec<T>,
  )

みたいな長いtraitを何度も使いたかったのでメモとして残しておきます。
クロージャを関数の返り値を

fn some_fn() -> impl Fn(i64, MyType<T>, bool, usize) -> (
    MyType<T>,
    i64,
    Vec<T>,
  ) {
  |/* 省略 */| {/* 省略 */}
}

ではなく

fn some_fn() -> impl LongFn<T> {
  |/* 省略 */| {/* 省略 */}
}

みたいに書きたかったので。

こうやります

結論から言うと、次のようにやります。

trait LongFn<T>:
  Fn(i64, MyType<T>, bool, usize) -> (
    MyType<T>,
    i64,
    Vec<T>,
  )
{}
impl <S, T> LongFn<T> for S where 
  S: Fn(i64, MyType<T>, bool, usize) -> (
      MyType<T>,
      i64,
      Vec<T>,
  ) {}

このようにすることで、クロージャに自動的にLongFn<T>が実装されて使うことができます。

ちなみにRust Unstableだと


trait_alias - The Rust Unstable Book
にあるように、次のようなtraitのエイリアスが提案されていました。
上のような方法があるので、今後安定化される可能性は低いでしょう。

#![feature(trait_alias)]

trait Foo = std::fmt::Debug + Send;
trait Bar = Foo + Sync;

参考

https://metareal.blog/post/2015/07/rust-trait-alias/