impl Trait
如果您创建一个返回需要无法省略的生命周期的函数,rustc 会告诉您添加它。
use futures::prelude::*;
fn make_fut(input: &()) -> impl Future<Output = ()> {
async move {
return *input
}
}
error[E0700]: hidden type for `impl futures::Future<Output = ()>` captures lifetime that does not appear in bounds
--> src/lib.rs:4:5
|
3 | fn make_fut(input: &()) -> impl Future<Output = ()> {
| --- ------------------------ opaque type defined here
| |
| hidden type `{async block@src/lib.rs:4:5: 4:15}` captures the anonymous lifetime defined here
4 | / async move {
5 | | return *input
6 | | }
| |_____^
|
help: add a `use<...>` bound to explicitly capture `'_`
|
3 | fn make_fut(input: &()) -> impl Future<Output = ()> + use<'_> {
| +++++++++
For more information about this error, try `rustc --explain E0700`.
+ '_
只需在返回类型中添加即可修复此错误,但 rustc 指示 use+ use<'_>
改为添加。运行仅显示前一个更改,根本rustc --explain E0700
没有提及。Rust书中没有提到在此上下文中使用。use<'_>
use
这是什么use<'lifetime>
语法?它的文档在哪里?我如何才能知道何时应该使用它而不是其他语法?
这是 Rust 1.82.0 中发布的新语法。
在发布博客文章中我们可以找到有关它的更多信息,并且还有一篇专门针对这种语法(及其同类语法)的博客文章,但大多数信息可以在RFC中找到。
简而言之,
use<'lifetime>
是的替代方案+ 'lifetime
,但更清晰,服务更好 - 在某些情况下,特别是涉及多个生命周期和有界限的生命周期的情况,+ 'lifetime
不会起作用但use<'lifetime>
会起作用(如 RFC 中所述)。它还将在未来支持
use<Type>
(意味着“捕获所有的生命周期Type
”),这无法使用+
语法来表达(尽管它也不需要,因为默认是(现在仍然是)捕获所有类型)。但最重要的是,它允许您选择退出捕获:自 2024 版起(甚至在此之前,对于
impl Trait
特征中的返回类型),默认情况下将捕获所有类型和生命周期(以前,仅捕获类型)。use<[optionally capture only some]>
允许您在需要时恢复旧行为。请注意,截至撰写本文时,RFC 尚未完全实现:目前,您仍必须捕获所有类型,并且我相信
use
在特征中使用才刚刚实现(甚至可能尚未合并)。这些限制最终将被取消。