Rustのfutures::stream::unfoldで非同期処理を行なう

unfoldというものを見つけた。これは再起処理のようなものを別で定義して呼び出すのではなく、クロージャの中に記述して実行することができる。サンプルではSomeを返す限り繰り返し実行され、Noneを返すことでループを抜けている。上手く使えばコード量を減らせそうだ。

use futures::stream::{self, StreamExt};

#[tokio::main]
async fn main() {

    let stream = stream::unfold(0, |state| async move {
        if state <= 2 {
            let next_state = state + 1;
            let yielded = state * 2;
            Some((yielded, next_state))
        } else {
            None
        }
    });

    assert_eq!(stream.collect::<Vec<i32>>().await, vec![0, 2, 4]);
}

https://doc.rust-lang.org/1.33.0/std/iter/fn.unfold.html

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA