Steam trait

Stream trait 与 Future 类似,但能在完成前返还(yield)多个值,与标准库中的 Iterator 类似:


#![allow(unused)]
fn main() {
trait Stream {
    /// 由 `stream` 产生的值的类型.
    type Item;

    /// 尝试解析 `stream` 中的下一项.
    /// 如果已经准备好,就重新运行 `Poll::Pending`, 如果已经完成,就重新
    /// 运行`Poll::Ready(Some(x))`,如果已经完成,就重新运行 `Poll::Ready(None)`.
    fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>)
        -> Poll<Option<Self::Item>>;
}
}

一个常见的使用 Stream 的例子是 futures 库中通道的 Receiver。每次 Sender 端发送一个值时,它就会返回一个 Some(val),并且会在 Sender 关闭且所有消息都接收后返还 None:


#![allow(unused)]
fn main() {
async fn send_recv() {
    const BUFFER_SIZE: usize = 10;
    let (mut tx, mut rx) = mpsc::channel::<i32>(BUFFER_SIZE);

    tx.send(1).await.unwrap();
    tx.send(2).await.unwrap();
    drop(tx);

    // `StreamExt::next` 类似于 `Iterator::next`, 但会返回一个实现
    // 了 `Future<Output = Option<T>>` 的类型.
    assert_eq!(Some(1), rx.next().await);
    assert_eq!(Some(2), rx.next().await);
    assert_eq!(None, rx.next().await);
}
}