У меня есть интерфейс, который определяет метод, возвращающий получателя:
pub fn subscribe(to: &str) -> crossbeam_channel::Receiver<Message>;
Я использую библиотечный метод, который возвращает Receiver, но с другим типом сообщения:
pub fn subscribe(to: &str) -> crossbeam_channel::Receiver<lib::Message>;
Достаточно легко преобразовать lib::Message
в Message
, но как я могу реализовать интерфейс, который будет действовать как оболочка для этой библиотеки, чтобы возвращаемый тип был правильным?
Я попытался создать новый канал, но это не работает (я думаю), поскольку метод вернется, а затем больше не будет передавать сообщения на новый канал, поэтому receiver
всегда будет пустым.
let sub_recv = subscription.receiver();
let (send, receiver) = crossbeam_channel::unbounded::<Message>();
for m in sub_recv.try_recv() {
send.send(m.into()).map_err(|_| MQError::ConversionError)?;
}
Спасибо
crossbeam_channel::Receiver
- это не интерфейс, а конкретный тип. Итак, да, если у вас есть реальный получатель, вам действительно нужно будет создать другую пару отправитель / получатель. Часть вашего кода отсутствует - это фоновый поток, который истощит исходный получатель, преобразует его и отправит отправителю. Также обратите внимание, что вы почти наверняка не хотите, чтобы промежуточный канал был неограниченным, потому что он не сможет обеспечить противодавление, если потребитель работает медленнее, чем производитель. - person user4815162342   schedule 14.04.2021