我写了下面的代码,但是无法编写生命周期约束以使其正常工作,并出现错误:
use futures::Future;
async fn foo<'a>(a: &'a str) -> &'a str {
let task = get();
f(a, task).await
}
async fn f<T>(v: T, task: impl Future<Output = T>) -> T {
if true {
v
} else {
task.await
}
}
async fn get() -> &'static str {
"foo"
}
错误:
error[E0759]: `a` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
--> src/lib.rs:3:18
|
3 | async fn foo<'a>(a: &'a str) -> &'a str {
| ^ ------- this data with lifetime `'a`...
| |
| ...is captured here...
4 | let task = get();
5 | f(a, task).await
| - ...and is required to live as long as `'static` here
我认为,如果函数 f
中的两个参数可以有各自不同的生命周期,那么问题就可以解决。
例如:
v: T,
task: S,
T: 'a,
S: 'b,
'b: 'a,
S == T
如何解决这个问题?
fn f<'a, 'b: 'a, T>(v: &'a T, task: impl Future<Output = &'b T>) -> &'a T
? - JmbT
是一个包含生命周期参数的结构体,就像Cow<'a, str>
一样。因此我不能将T
重写为&'a T
。 - tamuheyU
修复(输出类型为Future
)。你的示例代码没有展示出为什么T
和U
需要除了生命周期以外是相同的类型。你的问题只阐述了一个“尝试解决”问题的方案,但并未说明实际问题是什么。很可能解决方案不在于声明两个泛型类型参数,这两个参数除了生命周期以外几乎是相同的,但是如果没有更多信息我们无法得知真正的问题所在。 - Sven Marnacha
的生命周期必须是static
,尽管T: 'a
是必要且充分的。 - tamuhey