#[derive(Debug, Default, Clone, Copy, Serialize)]
pub struct Unit<'a> {
id: &'a str,
}
impl Unit<'_> {
fn unpack<'a>(bytes: &'a [u8]) -> Option<Unit<'a>> {
match from_utf8(bytes) {
Ok(v) => Some(Self { id: v }),
Err(_) => None,
}
}
}
问题就在这一行
Some(Self { id: v })
上,v
的值为错误:“lifetime may not live long enough associated function was supposed to return data with lifetime 'a
but it is returns data with lifetime '1
"
固定:
#[derive(Debug, Default, Clone, Copy, Serialize)]
pub struct Unit<'a> {
id: &'a str,
}
impl<'a> Unit<'a> {
fn unpack(bytes: &'a [u8]) -> Option<Unit<'a>> {
match from_utf8(bytes) {
Ok(v) => Some(Self { id: v }),
Err(_) => None,
}
}
}
这里的问题是
impl Unit<'_>
,看起来这样使得Self
类型成为Unit<'1>
。如果您像这样将 impl 指定为 Unit<'a>
,那么生命周期关系就可以了:
#[derive(Debug, Default, Clone, Copy)]
pub struct Unit<'a> {
id: &'a str,
}
impl<'a> Unit<'a> {
fn unpack(bytes: &'a [u8]) -> Option<Self> {
match core::str::from_utf8(bytes) {
Ok(v) => Some(Self { id: v }),
Err(_) => None,
}
}
}
我还需要在呼叫站点解决问题,为此通过将
'a
添加到 unpack(bytes: &[u8])
使其成为 unpack(bytes: &'a [u8])
。这确保字节的整个生命周期在所有相关数据之间共享。
pub struct TAIP<'a> {
/// [char; 1]
pub qualifer: Qualifer,
/// [char; 2]
pub message: Message,
pub data: Data,
/// This is referred to as ID in the spec.
pub unit: Option<Unit<'a>>,
}
impl<'a> TAIP<'a> {
fn unpack(bytes: &'a [u8]) -> Result<Self, &'static str> {
let pv = PV::unpack(&bytes[4..34]);
Ok(Self {
qualifer: Qualifer::from_u8(bytes[1] as char),
message: Message::unpack(&bytes[2..4]),
data: Data::PV(pv),
unit: Unit::unpack(&bytes[38..42]),
})
}
}