Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust “| |异步移动{}”和“异步移动| |{}”之间有什么区别` 我们考虑下面的例子:_Rust - Fatal编程技术网

Rust “| |异步移动{}”和“异步移动| |{}”之间有什么区别` 我们考虑下面的例子:

Rust “| |异步移动{}”和“异步移动| |{}”之间有什么区别` 我们考虑下面的例子:,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

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)
    };
}

我问的是表达式
|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 */ })()