Как я могу превратить поток в RepeatedField в Rust? - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть следующая структура в Rust, которую я хочу вернуть из своего сервиса:

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

, и я установил его поле names (см. документ о еговведите) следующим образом:

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)?

1 Ответ

0 голосов
/ 23 февраля 2019

есть соответствующие фрагменты кода из источников 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 }
}

Так что нет, ваш код уже прост и оптимален: он создает вектор, а затем просто перемещает его в структуру без ненужного копирования.

...