Rust:打印作为参数传入的函数的名称

  • 本文关键字:函数 参数 打印 Rust rust
  • 更新时间 :
  • 英文 :


我正试图将参数打印到以下函数:

pub async fn loop_until_hit_rate_limit<'a, T, Fut>(
object_arr: &'a [T],
settings: &'a Settings,
pool: &'a PgPool,
f: impl Fn(&'a Settings, &'a PgPool, &'a T) -> Fut + Copy,
rate_limit: usize,
) where
Fut: Future<Output = anyhow::Result<()>>,
{
// do stuff
println!("args were: {}, {}, {}, {}, {}", object_arr, settings, pool, f, rate_limit) // <--- how do I make this work?
}

天真的方法失败了,出现以下错误之一(对于{}(:

^ `impl Fn(&'a Settings, &'a PgPool, &'a T) -> Fut + Copy` cannot be formatted with the default formatter

或者这个错误(对于{:?}(:

^ `impl Fn(&'a Settings, &'a PgPool, &'a T) -> Fut + Copy` cannot be formatted using `{:?}` because it doesn't implement `std::fmt::Debug`

这两者都有道理,但我不知道如何避开它们。我找到了这个线程,但它只打印调用函数的名称,而不是作为arg传入的名称。

有办法做到这一点吗?

有办法做到这一点吗?

是。使用std::any::type_name可以获得任何类型的名称。

所以你可以这样做:

pub async fn loop_until_hit_rate_limit<'a, T, Fut>(
object_arr: &'a [T],
settings: &'a Settings,
pool: &'a PgPool,
f: impl Fn(&'a Settings, &'a PgPool, &'a T) -> Fut + Copy,
rate_limit: usize,
) where
Fut: Future<Output = anyhow::Result<()>>,
{
// do stuff
fn type_name_of<T>(_: T) -> &'static str {
std::any::type_name::<T>()
}
let f_name = type_name_of(f);
println!("args were: {}, {}, {}, {}, {}", object_arr, settings, pool, f_name, rate_limit)
}

具有各种功能的操场简化示例

最新更新