Rust Futureを返す非同期関数を高階関数で使用する

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

例えば、以下のような関数。

pub async fn func_name() -> String {
  "".to_string()
}

実際は以下のようにimpl futures::Futureが返される関数のようになる。

pub fn func_name() -> impl futures::Future<Output = String>

で、こういった関数を、高階関数の引数として与えたい場合。

execute_func( func_name );

のようなイメージ。

高階関数のジェネリクスと境界指定

上記で示したexecute_funcは以下のように記述してFuture型を返す関数を受け取ることができる。

pub async fn execute_func<F, Fut>(
  func: F,
) -> String
where 
  F: Fn() -> Fut,
  Fut: Future<Output = String>
{
  func().await
}

な感じ。

Fn() -> Future<Output = String>と1行でいけそう気もしたけどこれではダメで、戻り値型を別境界で指定することで、非同期関数を渡すことができた。