014 Rust 異步編程,遞歸

在內(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。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容