1

Rust 播放示例:https ://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=f795cd150774a61e8580c602c7f4e0f4

我有一个解码器,它将产生 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

4

0 回答 0