stream - 如何在 Rust 中将 Stream 转换为 RepeatedField?

标签 stream rust protocol-buffers

我想从我的服务中返回以下 Rust 结构:

#[derive(PartialEq,Clone,Default)]
pub struct Response {
    pub names: ::protobuf::RepeatedField<String>,
}

然后我按以下方式设置它的 names 字段(参见 the doc 关于它的类型):

use protobuf::{Message, RepeatedField};
use futures::future::Future;
use futures::Stream;

fn create_response(names: impl Stream<Item = String, Error = CustomError>) -> Result<Response, CustomError>
   let names = names.collect().wait()?;
   let mut response = Response::new();
   response.set_names(RepeatedField::from_vec(names));
   Ok(response)
}

现在我想优化这段代码,避免阻塞collect操作。有什么方法可以将 names 直接流式传输到 response.names 字段中(即,避免创建 names 向量的步骤)?

最佳答案

有来自 protobuf 来源的相关代码片段:

/// Wrapper around vector to avoid deallocations on clear.
pub struct RepeatedField<T> {
    vec: Vec<T>,
    len: usize,
}

/// Create a contained with data from given vec.
#[inline]
pub fn from_vec(vec: Vec<T>) -> RepeatedField<T> {
    let len = vec.len();
    RepeatedField { vec: vec, len: len }
}

所以不,您的代码已经很简单且优化了:它创建向量,然后将其移动到结构中,而无需进行不必要的复制。

关于stream - 如何在 Rust 中将 Stream 转换为 RepeatedField?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54829412/

相关文章:

python - 将 Python 列表传递给 Rust 函数

json - 将 json 转换为 TreeMap<String, String>

rust - 无法构建Dotenv V0.15.0-使用rust 的 cargo

javascript - 与 HTTP/2 相比,protobuf 是否提供大小和速度增益?

java - Netty - 如何交换不同的 Protocol Buf 对象并解码它们?

c# - .NET 中是否有只读流的默认实现?

c++ - 流类的基类

protocol-buffers - Protocol Buffer 是否支持具有共享引用的对象图的序列化?

http - 使用 ffserver 和 ffmpeg 将来自 USB 网络摄像头的视频嵌入到网页中

objective-c - Runloop 在使用流进行调度时不会被触发