我不应该在 future::stream::Unfold 上调用 next 吗?

Shouldn't I call next on future::stream::Unfold?

我在这个函数返回的 Stream 上多次调用 nexthttps://github.com/sdroege/rtsp-server/blob/96dbaf00a7111c775348430a64d6a60f16d66445/src/listener/message_socket.rs#L43:

pub(crate) fn async_read<R: AsyncRead + Unpin + Send>(
    read: R,
    max_size: usize,
) -> impl Stream<Item = Result<Message<Body>, ReadError>> + Send {
    
    //...

    futures::stream::unfold(Some(state), move |mut state| async move {
        //...
    })
}

有时有效,但有时我得到:

thread 'main' panicked at 'Unfold must not be polled after it returned `Poll::Ready(None)`', /root/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.13/src/stream/unfold.rs:115:21

错误来自https://docs.rs/futures-util/0.3.2/src/futures_util/stream/unfold.rs.html#112

但我不明白为什么。我不应该在流中循环调用 next 吗?

这个错误是有原因的错误,因为它可能意味着你做错了什么:当流 returns Poll::Ready(None) 时,这意味着流已完成(在与 Iterator 类似的方式,如评论所述)。

但是,如果您仍然确定这是您想要执行的操作,那么您可以调用 stream.fuse() 以消除错误并永远简单地 return Poll::Ready(None)