例えば、以下のような関数。
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行でいけそう気もしたけどこれではダメで、戻り値型を別境界で指定することで、非同期関数を渡すことができた。