理解 rust 中的 futures(五)

我们的实现
#[derive(Default)]
struct MyFuture {
    count: u32,
}

impl Future for MyFuture {
    type Output = i32;

    fn poll(&mut self, ctx: &Context) -> Poll<Self::Output> {
        match self.count {
            3 => Poll::Ready(3),
            _ => {
                self.count += 1;
                ctx.waker().wake();
                Poll::Pending
            }
        }
    }
}

让我们一行一行来看:

  • #[derive(Default)] 自动为类型创建 ::default() 函数,数字被初始化为 0。
  • struct MyFuture { count: u32 } 定义了一个简单的包含一个 counter 的结构体,这允许我们可以模拟异步行为。
  • impl Future for MyFuture 是我们对 trait 的实现。
  • 我们把关联类型设置为 i32,这样我们就可以返回我们内部的 counter 值。
  • 在我们对 poll 函数的实现中,我们根据内部 counter 字段的值来决定做什么。
  • 如果 counter 的值为 3,我们返回 Poll::Ready 的返回值,其值为 3.
  • 其它情况下,我们将 counter 加 1 并返回 Poll::Pending

然后我们就可以用一个 main 函数来运行我们的 future 了!

fn main() {
    let my_future = MyFuture::default();
    println!("Output: {}", run(my_future));
}

Run it yourself!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容