Rust 静态未来不';我活得不够长
在使用async/await时,我偶然发现了这个终生的难题。我假设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
谓词
获取一个引用/值并生成静态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
应该适合任何生存期限制。同时,如果我用directfuture::Ready
替换返回类型,它会工作得很好。我希望它相当于impl Future+'static
如果我将predicate
返回类型更改为impl Future+'static
,它为什么仍然失败。我认为'static
应该适合任何生存期限制。同时,如果我用directfuture::Ready
替换返回类型,它会工作得很好。我希望它相当于impl Future+'static