use core::future::Future;
async fn handle(req: &str) -> u32 {
println!("{:?}", req);
123123
}
async fn make_service<F, Fut>(f: F)
where
F: for<'a> Fn(&'a str) -> Fut + Clone + 'static,
Fut: Future<Output = u32>,
{
println!("result = {}", f("req").await);
}
#[tokio::main]
async fn main() {
make_service(handle);
}
报错信息如下:
error[E0308]: mismatched types
--> src/main.rs:18:2
|
18 | make_service(handle);
| ^^^^^^^^^^^^^^^^^^^^ one type is more general than the other
|
= note: expected opaque type `impl for<'a> Future<Output = u32>`
found opaque type `impl Future<Output = u32>`
= help: consider `await`ing on both `Future`s
= note: distinct uses of `impl Trait` result in different opaque types
note: the lifetime requirement is introduced here
--> src/main.rs:10:16
|
10 | F: Fn(&str) -> Fut + Clone + 'static,
| ^^^
For more information about this error, try `rustc --explain E0308`.
没有明白,求教各位大佬,有什么知识点
1
共 5 条评论, 1 页
评论区
写评论另外解释一下报错信息具体是什么意思:
第二行提示的是实际传入的类型是
impl Future<Output = u32>
也就是Fut
,它没有任何的捕获生命周期,但是期望的类型却需要捕获生命周期。handle
函数因为(1)的缘故,返回的impl Future
会捕获req
, 那么它的impl Future
生命周期和req
一致. 根据(2)的约束,F
作为一个函数,它的返回值Fut
和参数&'a str
的生命周期'a
没有关系(注意这里的'static
只是标注了F
的生命周期) 所以问题的根本在于F
和Fut
的生命周期不一致导致的问题。 修改make_service
签名以让F
和Fut
使用同一个生命周期即可:在线尝试
按提问的意思应该是想吧_a放到异步里去 所以【苦瓜小仔】的装箱future估计才是他要的结果
--
👇
zylthinking: 首先, async fn handle(req: &str) -> u32 这种写法, 不会满足原型: for<'a> Fn(&'a str) -> Fut + Clone + 'static, 它只会认为返回的 future 捕获了 req; 若想表达其实没有捕获 req, 使用明确的语法, 别用语法糖。
其次, 你是真的捕获了 req, 你在 future 里面打印了 req
所以, 最大的问题并不是你的语法问题, 而是你切切实实写出了 bug; 自然, 看上去你语法其实也没搞明白, 但这属于问题相对较小的那个。
一个能编译运行的例子如下:
知识点就在 https://rustcc.cn/article?id=822e5659-4286-4bd5-a5ec-23793f2be833 帖子回复中,我给的三个链接里(我不想在各个地方重复解释相同的问题)
首先, async fn handle(req: &str) -> u32 这种写法, 不会满足原型: for<'a> Fn(&'a str) -> Fut + Clone + 'static, 它只会认为返回的 future 捕获了 req; 若想表达其实没有捕获 req, 使用明确的语法, 别用语法糖。
其次, 你是真的捕获了 req, 你在 future 里面打印了 req
所以, 最大的问题并不是你的语法问题, 而是你切切实实写出了 bug; 自然, 看上去你语法其实也没搞明白, 但这属于问题相对较小的那个。
一个能编译运行的例子如下: