У меня есть черты для отправителей и получателей определенного типа сообщения.
pub trait Sends {
type Message;
fn send(&self) -> Self::Message;
}
pub trait Receives {
type Message;
fn receive(&mut self, msg: Self::Message);
}
Я хочу иметь возможность хранить совместимую пару отправителя и получателя в структуре с методом run()
, который передает сообщения, то есть receiver.receive(sender.send())
.
Моя интуиция такова, что этот метод run()
не должен требовать знания типа сообщения (поскольку все вхождения типа сообщения обрабатываются внутри), поэтому структура и ее метод не должны раскрывать тип сообщения. Я думаю, что отслеживание типов сообщений также становится непрактичным, когда у вас большая сеть отправителя-получателя.
Как лучше всего это сделать? Я попробовал с Any
, который в основном работает. Однако,
- У меня возникли трудности с созданием
SendAny
изSend
, и то же самое для приемника. - Я надеюсь, что есть более элегантный и эффективный способ, так как он вводит шаблон и ненужную упаковку/распаковку.
Вот что у меня есть до сих пор:
trait SendsAny {
fn send_any(&self) -> Box<dyn Any>;
}
impl<T> SendsAny for T
where
T: Sends,
T::Message: 'static,
{
fn send_any(&self) -> Box<dyn Any> {
Box::new(self.send())
}
}
// Similar for ReceivesAny
struct SendAndReceive {
// These have to have matching Message types
tx: Box<dyn SendsAny>,
rx: Box<dyn ReceivesAny>,
}
impl SendAndReceive {
fn new<M: 'static>(
tx: Box<dyn Sends<Message = M>>,
rx: Box<dyn Receives<Message = M>>,
) -> Self {
// This doesn't work
let tx = tx as Box<dyn SendsAny>;
todo!()
}
fn run(&mut self) {
self.rx.receive_any(self.tx.send_any());
}
}