让我们考虑以下示例:
main.rs
use futures::executor::block_on;
use futures::future::{FutureExt, TryFutureExt};
async fn fut1() -> Result<String, u32> {
Ok("ok".to_string())
}
fn main() {
println!("Hello, world!");
match block_on(fut1().and_then(|x| async move { Ok(format!("{} is \"ok\"", x)) })) {
Ok(s) => println!("{}", s),
Err(u) => println!("{}", u)
};
}
Cargo.toml
[dependencies]
futures = "^0.3"
我要问的是表达式|x| async move {}
而不是async move |x| {}
。后者更为明显,但是会遇到编译错误:
error[E0658]: async closures are unstable
那我想知道async move || {}
和|| async move {}
有什么区别。两者似乎都是使用move
关键字的闭包。
$ rustc --version
rustc 1.39.0 (4560ea788 2019-11-04)
答案 0 :(得分:1)
一个是异步块(精确地说是一个以异步块为主体的闭包),而另一个是异步闭包。根据{{3}}:
async ||
闭包除了功能之外,异步还可以应用于闭包。与异步函数类似,异步闭包的返回类型为
impl Future<Output = T>
,而不是T
。
另一方面:
async
块您可以使用
async
块直接将Future创建为表达式。这种形式几乎等同于立即调用的async
闭包:async { /* body */ } // is equivalent to (async || { /* body */ })()
除了正文中不允许使用
return
,break
和continue
之类的控制流构造之外。
此处的move
关键字表示异步闭包和阻塞将捕获其关闭的变量的所有权。
显然,异步关闭仍然被认为是不稳定的。它有async/await RFC。