【问题标题】:Iterating over Stream in Rust在 Rust 中迭代 Stream
【发布时间】:2023-04-08 18:33:01
【问题描述】:

我正在尝试使用 bollard crate 迭代来自 docker 容器的日志。

这是我的代码:

use std::default::Default;

use bollard::container::LogsOptions;
use bollard::Docker;

fn main() {
    let docker = Docker::connect_with_http_defaults().unwrap();

    let options = Some(LogsOptions::<String>{
        stdout: true,
        ..Default::default()
    });

    let data = docker.logs("2f6c52410d", options);
    // ...
}

docker.logs() 返回impl Stream&lt;Item = Result&lt;LogOutput, Error&gt;&gt;。我想迭代结果,但我不知道该怎么做。我设法从future_utils 板条箱中找到了一个使用try_collect::&lt;Vec&lt;LogOutput&gt;&gt;() 的示例,但我想在while 循环中迭代结果,而不是在向量中收集结果。我知道我可以迭代一个向量,但是在循环中执行任务对我的用例来说会更好。

我尝试为流调用poll_next() 方法,但它需要一个我不明白的神秘Context 对象。 poll_next() 方法在我在流上使用 pin_mut!() 宏之前不可用。

如何迭代流?我应该阅读什么来了解这里发生了什么?我知道流与Futures 相关,但调用awaitnext() 在这里不起作用。

【问题讨论】:

    标签: rust


    【解决方案1】:

    您通常会引入您选择的库的 StreamExt 特征,然后执行类似的操作

    while let Some(foo) = stream.next().await {
        // ...
    }
    

    【讨论】:

    • 你能详细说明一下吗? bring in your library of choice's StreamExt trait 是什么意思?流没有next() 方法。
    • @Djent futures::stream::StreamExtStreams 添加了诸如next() 之类的扩展方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-09
    • 1970-01-01
    • 2023-03-25
    • 2023-03-31
    • 2021-11-14
    • 2016-07-02
    相关资源
    最近更新 更多