Rust 静态未来不';我活得不够长

Rust 静态未来不';我活得不够长,rust,async-await,lifetime,Rust,Async Await,Lifetime,在使用async/await时,我偶然发现了这个终生的难题。我假设谓词获取一个引用/值并生成静态future-它没有对其参数的引用,也没有捕获任何值。相反,我被抱怨生命太短 它为什么会失败?它的生命周期在哪里 使用期货::未来; 使用std::future::future; fn验证(\uf:F) 哪里 F:FnMut(&str)->Fut, 未来,, { } fn谓词(\:impl AsRef)->impl Future{ 未来::就绪(真) } fn main(){ 验证(| x |谓词(x

在使用async/await时,我偶然发现了这个终生的难题。我假设
谓词
获取一个引用/值并生成静态future-它没有对其参数的引用,也没有捕获任何值。相反,我被抱怨生命太短

它为什么会失败?它的生命周期在哪里

使用期货::未来;
使用std::future::future;
fn验证(\uf:F)
哪里
F:FnMut(&str)->Fut,
未来,,
{
}
fn谓词(\:impl AsRef)->impl Future{
未来::就绪(真)
}
fn main(){
验证(| x |谓词(x));
}
错误消息:

错误:生命周期可能不够长
-->src\main.rs:16:18
|
16 |验证(| x |谓词(x));
|-->^^^^^^^^^^^^^^返回此值要求“1”必须比“2”更长寿`
|               ||
||关闭的返回类型为impl futures::Future
|具有类型`&'1 str`
错误:由于上一个错误而中止

这里的错误消息有点让人困惑,因为它讲的是两个生命周期,
'1
'2
,但实际上没有说明
'2
指的是什么

这里有两个重要的生命周期:

  • &str
    参数,消息将其标记为生存期
    '1
  • future类型变量
    Fut
    ,它在消息中标记为生存期
    '2
    ,但它没有明确说明这一点
谓词的推断生存期(使用)如下所示:

fn predicate<'x>(_: impl AsRef<str> + 'x) -> impl Future<Output = bool> + 'x {
    future::ready(true)
}
此函数接受比
谓词
要求更广的参数,这意味着它不能保证强制执行
谓词
所需的约束

您可以通过在
validate
类型中显式地修改它:

fn validate<'a, F, Fut>(_: F)
where
    F: FnMut(&'a str) -> Fut,
    Fut: Future<Output = bool> + 'a,
{
}
fn验证未来,
未来:未来+a,
{
}

'a
生存期约束这两种类型,表明
验证
期望
F
使用
&str
中的数据,因此将确保字符串的寿命足够长。任何违反此约定的
验证
实现也不会编译。

此处的错误消息有点混乱,因为它涉及两个生命周期,
'1
'2
,但实际上没有说明
'2
指的是什么

这里有两个重要的生命周期:

  • &str
    参数,消息将其标记为生存期
    '1
  • future类型变量
    Fut
    ,它在消息中标记为生存期
    '2
    ,但它没有明确说明这一点
谓词的推断生存期(使用)如下所示:

fn predicate<'x>(_: impl AsRef<str> + 'x) -> impl Future<Output = bool> + 'x {
    future::ready(true)
}
此函数接受比
谓词
要求更广的参数,这意味着它不能保证强制执行
谓词
所需的约束

您可以通过在
validate
类型中显式地修改它:

fn validate<'a, F, Fut>(_: F)
where
    F: FnMut(&'a str) -> Fut,
    Fut: Future<Output = bool> + 'a,
{
}
fn验证未来,
未来:未来+a,
{
}

'a
生存期约束这两种类型,表明
验证
期望
F
使用
&str
中的数据,因此将确保字符串的寿命足够长。任何违反此合同的
validate
实现也不会编译。

我认为它与此相关。您可以通过在
验证中添加另一个泛型来修复它:
其中R:AsRef,F:FnMut(R)->Fut,
…深渊向我敞开。我确实需要一些时间来处理它。谢谢你指出这个问题。我认为这与另一个有关。您可以通过在
验证中添加另一个泛型来修复它:
其中R:AsRef,F:FnMut(R)->Fut,
…深渊向我敞开。我确实需要一些时间来处理它。感谢您指出这个问题。我想知道如果我将
谓词
返回类型更改为
impl Future+'static
,为什么它仍然失败。我认为
'static
应该适合任何生存期限制。同时,如果我用direct
future::Ready
替换返回类型,它会工作得很好。我希望它相当于
impl Future+'static
如果我将
predicate
返回类型更改为
impl Future+'static
,它为什么仍然失败。我认为
'static
应该适合任何生存期限制。同时,如果我用direct
future::Ready
替换返回类型,它会工作得很好。我希望它相当于
impl Future+'static