Вот однострочное изменение, которое вы можете сделать, чтобы этот код был корректным:
fn on_message(&mut self, msg: &'a [u8])
Вместо того, чтобы принимать Vec<u8>
по значению, возьмите ссылку на фрагмент, который уже гарантированно будет жить припо крайней мере, пока 'a
.Это означает, что вызывающий абонент несет ответственность за то, чтобы все, что вы передадите на on_message
, проживало достаточно долго для отправки по каналу.
Но, возможно, вы не сможете этого сделать,Либо у вызывающей стороны возникнет та же проблема, и вы не сможете ее поднять дальше, либо Vec<u8>
является обязательной частью подписи on_message
.Если это так, вам придется изменить read_message
.Вот одна из возможностей:
fn read_message<'b>(bytes: Vec<u8>) -> NetworkMessage<'b> {
NetworkMessage::PlayerActionMessage(PlayerAction {
data: Cow::Owned(bytes),
})
}
impl<'a> MessageHandler<'a> {
fn on_message(&mut self, msg: Vec<u8>) {
let readm = read_message(msg);
self.connection_manager.channel.send(readm);
}
}
Перемещение msg
в read_message
оставляет компилятору свободу выбора любого времени жизни, которое он хочет за 'b
.В on_message
он может просто выбрать 'a
для компиляции кода.Недостаток этого подхода заключается в том, что вам может потребоваться .clone()
Vec
, если вам потребуется использовать его снова после отправки по каналу.