Rust中如何将函数转换为实现Foo trait的泛型函数指针?
解决函数指针转泛型Future trait的问题
问题原因
你的async fn test()返回的是编译器生成的匿名Future类型,而Foo trait针对的是fn() -> Fut这类明确的函数指针类型。编译器无法自动推断Fut应对应哪个匿名Future,导致as _无法完成类型转换。
解决方案
方法1:用临时变量标注类型
通过显式声明函数指针变量,让编译器自动推断对应Fut类型:
async fn test() -> Result<(), Error> { Ok(()) } let test_ptr: fn() -> _ = test; Foo::bar(&test_ptr);
方法2:直接在转换时指定通配符类型
在as转换中明确写出函数指针结构,用_让编译器推断Future类型:
Foo::bar(&(test as fn() -> _));
方法3:调整trait实现(可选)
如果场景允许,可将trait Foo的实现扩展到所有符合条件的可调用类型,无需强制转换为函数指针:
impl<T, Fut> Foo for T where T: Fn() -> Fut, Fut: Future<Output = Result<(), Error>>, { type Future = Fut; fn bar(&self) -> Self::Future { self() } }
之后直接调用Foo::bar(&test)即可,编译器会自动完成类型推断。
补充说明
你提到的泛型Fn* trait推断问题确实与该场景相关——编译器处理泛型函数指针的类型推断时,无法从trait方法的调用反向推导泛型参数,因此需要我们提供更明确的类型提示。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

