我有一个解码器,它将产生 MESSAGE (特征)类型的项目。我想让解码器通用,这样理想情况下我可以生成具有正确类型的 MESSAGE,而无需稍后指定类型。
定义解码器:
use std::marker::PhantomData;
struct Decoder<MESSAGE> {
_phantom: PhantomData<MESSAGE>,
}
impl<MESSAGE> Decoder<MESSAGE> {
pub fn new() -> Self {
Decoder {
_phantom: PhantomData::default(),
}
}
pub fn decode_message_from_buffer<'a, 'b>(&'b self, buffer: &'a mut [u8]) -> MESSAGE where MESSAGE: MessageType<'a> {
MESSAGE::from(buffer)
}
}
定义特征
trait MessageType<'a> {
fn from(buffer: &'a mut [u8]) -> Self;
}
创建ApiMessage
实现 MessageType (MESSAGE) 特征的消息。
struct ApiMessage<'a> {
_slice: &'a [u8]
}
impl<'a> MessageType<'a> for ApiMessage<'a> {
fn from(buffer: &'a mut [u8]) -> Self {
ApiMessage {
_slice: &buffer[..5]
}
}
}
现在是主循环,我首先在其中初始化解码器(使用预期的 MESSAGE[type] = ApiMessage)。然后我初始化缓冲区,这是解码所需的。
如果我直接调用解码器方法(循环内的第二个示例),它可以工作。
但是使用辅助方法(其他逻辑需要),我得到一个关于缓冲区不够长的错误。
fn main() {
let mut decoder: Decoder<ApiMessage> = Decoder::new();
// if the buffer is moved inside while-loop, error is "borrowed value does not live long enough"
let mut buffer = [0u8; 1024];
for _ in 0..5 {
// ERROR: can't borrow buffer in a loop
let _message = decode_with_decoder(&mut decoder, &mut buffer);
// however, this works
// let _message = decoder.decode_message_from_buffer(&mut buffer);
}
}
这是辅助方法。
fn decode_with_decoder<'a, MESSAGE>(decoder: &mut Decoder<MESSAGE>, buffer: &'a mut [u8]) -> MESSAGE
where MESSAGE: MessageType<'a>
{
decoder.decode_message_from_buffer(buffer)
}
我认为失败是由上述定义中的 MESSAGE 引起的Decoder<MESSAGE>
(使用生命周期'a,即解码器结构的生命周期),以及使用相同生命周期的返回结果 MESSAGE。
有没有办法解耦解码器结构中消息类型的生命周期,并产生消息decode_with_decoder
?