我想从我的服务中返回以下 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/