#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. Спасибо. Сработало, как и ожидалось.