我在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 }
}
所以不,你的代码已经很容易和最优:它创建了向量,然后只是将它移动到结构而不需要不必要的复制。