如何在Stream中将Stream转换为RepeatedField?

问题描述 投票:-1回答:1

我在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向量的步骤)?

stream rust protocol-buffers
1个回答
1
投票

来自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 }
}

所以不,你的代码已经很容易和最优:它创建了向量,然后只是将它移动到结构而不需要不必要的复制。

© www.soinside.com 2019 - 2024. All rights reserved.