我们的实现
#[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));
}