Rust “| |异步移动{}”和“异步移动| |{}”之间有什么区别` 我们考虑下面的例子:
main.rsRust “| |异步移动{}”和“异步移动| |{}”之间有什么区别` 我们考虑下面的例子:,rust,Rust,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| a
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)
};
}
我问的是表达式|x | async move{}
而不是async move |x |{}
。后者更为明显,但会出现编译错误:
error[E0658]: async closures are unstable
然后我想知道,async move{}
和|124; async move{}
之间有什么区别。它们似乎都是使用move
关键字的闭包
$ rustc --version
rustc 1.39.0 (4560ea788 2019-11-04)
一个是异步块(确切地说是以异步块作为主体的闭包),另一个是异步闭包。Per:
async | |
closures
除了函数之外,异步也可以应用于闭包。与异步函数一样,异步闭包的返回类型为impl Future
,而不是T
另一方面:
async
块
可以使用async
块直接将future创建为表达式。此表单几乎相当于立即调用的async
闭包:
async { /* body */ }
// is equivalent to
(async || { /* body */ })()
除了像return
、break
和continue
这样的控制流构造在主体中是不允许的
这里的move
关键字表示异步闭包和块用于捕获它们关闭的变量的所有权
显然,异步闭包仍然被认为是不稳定的。它有。所以它现在的导入没有区别,不是吗?@dronte7没有,除了一个不稳定的事实。它们都会立即转变为未来,使用ot,而不需要获取一些环绕变量。除了不稳定之外,异步闭包与获取外部变量的异步块是一样的,不是吗?@dronte7它们在被调用时都返回未来。就捕获变量而言,它们也是一样的。这就是闭包的含义,异步与否。我认为在这两种情况下捕获变量是完全不同的<代码>异步移动| |…将变量从封闭块移动到闭包中,而
异步移动{…}
将变量从闭包移动到异步块中。如果要将它们从封闭块移动到异步块中,我认为现在需要使用move | | async move{…}
。
async { /* body */ }
// is equivalent to
(async || { /* body */ })()