在內(nèi)部,async fn創(chuàng)建一個狀態(tài)機類型,其中包含每個正在等待的子Future。那么,當涉及到遞歸的時候怎么辦呢?
示例
示例1
- 源碼
use futures;
async fn first() {}
async fn second() {}
async fn foo() {
first().await;
second().await;
}
fn main() {
futures::executor::block_on(foo());
}
- 配置
[dependencies]
futures = "0.3"
- 說明
編譯器會async塊生成對應(yīng)的結(jié)構(gòu)體,上面的例子生成的結(jié)構(gòu)體如下:
enum Foo {
First(first),
Second(second),
}
示例2
那么,當對應(yīng)到遞歸會是什么樣的呢?
- 源碼
use futures;
fn re() {
re().await;
re().await;
}
fn main() {
futures::executor::block_on(re());
}
- 說明
運行該程序報錯。編譯器對應(yīng)的展開可能如下:
enum Re {
First(Re),
Second(Re),
}
顯然,這樣創(chuàng)造了一個無限尺寸大小的類型,因此報錯。
解決辦法
那么我們要使用遞歸怎么辦?只需要使用Box就可以了,不過對應(yīng)的限制是需要變成同步函數(shù)。
- 源碼
use futures::future::{BoxFuture, FutureExt};
fn re() -> BoxFuture<'static, ()> {
async move {
re().await;
re().await;
}.boxed()
}
fn main() {
re();
}
- 配置
[dependencies]
futures = "0.3"
運行ok。