如何声明相同类型的泛型参数(rust中的生存期除外)?

如何声明相同类型的泛型参数(rust中的生存期除外)?,rust,lifetime,Rust,Lifetime,我写了下面的代码,但我不能写终身限制来工作并得到一个错误: 使用期货::未来; 异步fn foo和'a str{ 让task=get(); f(a,任务)。等待 } 异步fn f(v:T,任务:impl Future)->T{ 如果是真的{ v }否则{ 任务,等待 } } 异步fn get()->&'static str{ “福” } 错误: error[E0759]: `a` has lifetime `'a` but it needs to satisfy a `'static` lif

我写了下面的代码,但我不能写终身限制来工作并得到一个错误:

使用期货::未来;
异步fn foo和'a str{
让task=get();
f(a,任务)。等待
}
异步fn f(v:T,任务:impl Future)->T{
如果是真的{
v
}否则{
任务,等待
}
}
异步fn get()->&'static str{
“福”
}
错误:

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


如何解决这个问题?

同样的问题可以通过另一个简单的例子重现,即使用函数接口而不是异步函数

fn get() -> impl FnOnce() -> &'static str {
    || "foo"
}

fn foo<'a, T: 'a, F>(_: &'a str, _: F)
where
    F: Fn() -> T,
    T: FnOnce() -> &'a str,
{
}

let x = "".to_string();
foo(&*x, &get);
此示例允许我们将
get
转换为函数参数,并观察到传递此函数会对生命周期
'a
施加硬约束,使其成为
'static
。尽管程序的目的是好的,返回供应商函数(或承诺)的函数不会提供与输出生命周期相关的协方差。也就是说,
()->&'static str
不能满足
对于
(伪代码)的
,最好是让我们的
在整个生命周期
'a
中变得通用。然后,子类型可能在实现中发生,因为我们知道字符串文本可以完成任何生命周期

fn get<'a>() -> impl FnOnce() -> &'a str {
    || "foo"
}
另见:


你的意思是:
fn-fNo
T
是一个包含生命周期参数的结构,如示例代码所示。您的示例代码没有说明为什么
t
U
需要是相同的类型,除了它们的生命周期。您的问题仅说明尝试解决问题的方法,而不是实际问题本身。很可能解决方案没有声明两个泛型类型参数,它们除了生存期之外都是相同的,但是如果没有更多信息,我们无法判断。谢谢。我修正了我的例子。我面临的真正问题更复杂,我不想在这里粘贴代码,因为我想展示MVCE。我想知道为什么编译器会抱怨
a
的生命周期必须是
静态的
,尽管
t:'a
是必需的且足够的。谢谢你的精彩回答!仅供参考,我简化了您的示例:
async fn get<'a>() -> &'a str {
    "foo"
}