Lifetime可能活的不够长,把lifetime注解放哪?

问题描述 投票:0回答:2
#[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,
        }
    }
}
string rust lifetime impl
2个回答
2
投票

这里的问题是

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,
        }
    }
}

0
投票

我还需要在呼叫站点解决问题,为此通过将

'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]),
        })
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.