Rust中如何获取可用的Dummy Future以解决泛型类型推断问题?
如何使用现成的Dummy Future解决Rust泛型类型推断问题
现成的Dummy Future选项
你不需要自己实现Dummy Future,futures_util crate提供了几个符合需求的现成类型:
futures_util::future::Ready<()>:一个立即完成的Future,输出为(),满足Future<Output = ()> + Send + 'static的约束,且大小固定,完全适合作为填充类型。futures_util::future::Pending<()>:一个永远不会完成的Future(调用poll永远返回Poll::Pending),如果你的场景不需要Future实际执行完成,可以用这个,但大多数情况下Ready<()>更合适。
修改后的代码示例
将main函数中的调用替换为:
use futures_util::future::Ready; #[tokio::main] async fn main() { // 使用现成的Ready<()>作为泛型参数 Thing::<Ready<()>>::some_method(3).await.unwrap(); }
额外优化建议
你的代码中some_method完全没有用到结构体Thing的泛型参数Fut,这种情况下可以通过调整代码结构彻底避免指定Dummy类型:
- 将
some_method移到不带泛型的impl块中:
// 使用`Thing<_>`让编译器自动推断泛型参数 impl Thing<_> { async fn some_method(a: i32) -> Result<(), Box<dyn std::error::Error>> { println!("I am some_method with value {}", a); Ok(()) } }
这样在main中直接调用Thing::some_method(3).await.unwrap();就不会报错了。
2. 如果some_method不需要关联到Thing结构体,直接将它定义为独立函数会更合理。
原错误原因回顾
编译器报错是因为async块的存在导致类型推断上下文受限,而some_method没有提供任何能让编译器推断Fut类型的线索,因此必须显式指定一个具体的Future类型。
内容的提问来源于stack exchange,提问作者clo_jur
相关产品推荐
相关产品推荐

