我想要运行类似以下代码的内容:
async fn get_user(s: &str) -> Option<User> { /* ... */ }
let user_id = Some("sessiontoken").and_then(|session_token| {
get_user(session_token)
.await // <- error
.map(|user| user.id)
});
但这样不行,因为await只能在async块或函数中使用。相反,如果我使用async块,闭包将返回
impl Future<Output = Option<_>>
,这是不允许的,因为Option::and_then
仅允许Option
作为返回类型。我所知道的唯一替代方案是使用
OptionFuture
,创建一个中间变量并使用.map
而不是.and_then
。use futures::future::OptionFuture;
let user: OptionFuture<_> = Some("sessiontoken")
.map(|session_token| {
get_user(session_token)
})
.into();
let user_id = user.await.flatten().map(|user| user.id);
但是这样真的很繁琐,而且阻止了我使用许多操作选项、结果或类似内容的函数,比如Option::and_then
。
难道没有更好的方法吗?
Option<Future<T>>
->Future<Option<T>>
。然后你可以做类似于session_token.transpose().await
这样的事情。 - Brandon DyerOption<Future>
更加符合人体工程学,我肯定会很感激,但不幸的是最近没有任何改变,至少在我看来是这样的。Rust 团队可能正在等待IntoFuture
稳定下来,因为我相信如果Option<Future>
直接实现了Future
,可能会存在潜在的混淆。此外,相关问题:如何从 Option 中转换出一个 Future? - kmdreko