Prost — метод «кодировать» не может быть вызван для объекта признака

#rust #prost

Вопрос:

Я пытаюсь написать универсальную функцию для кодирования и декодирования сообщений prost с помощью приведенного ниже кода.

 pub fn write_message(amp;mut self, message: amp;mut dyn prost::Message) -> std::io::Result<usize> {
    let mut buf: Vec<u8> = Vec::new();
    buf.reserve(message.encoded_len());
    message.encode(amp;mut buf).unwrap();
    self.stream.write(amp;*buf);
    Ok(buf.len())
}
 

При этом я получаю следующую ошибку.

 error: the `encode` method cannot be invoked on a trait object    
|         message.encode(amp;mut buf).unwrap();    
|                 ^^^^^^    | 

   | 50 |         Self: Sized,    |               ----- this has a
`Sized` requirement
 

Как это исправить?

Ответ №1:

Функция encode не может быть использована для объектов признаков, так как она использует универсальные.

Вместо этого вы можете сделать write_message универсальный:

 fn write_message<M: prost::Message>(amp;mut self, message: amp;mut M)
 

Комментарии:

1. Спасибо. Сработало, как и ожидалось.