使用通用生命周期时,借用的价值寿命不够长?

snl*_*lan 6 lifetime rust serde-json

使用通用生命周期\xe3\x80\x82时借用的值没有足够长的寿命

\n\n
fn get<'a, T>(&self, key: &[u8]) -> Result<Option<T>>\nwhere\n    T: Deserialize<'a>,\n{\n    match self.db.get(key)? {\n        Some(dbv) => {\n            let v = serde_json::from_slice(&*dbv)?;\n            Ok(Some(v))\n        }\n        None => Ok(None),\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

函数 db.get 声明:

\n\n
pub fn get(&self, key: &[u8]) -> Result<Option<DBVector>, String>\n
Run Code Online (Sandbox Code Playgroud)\n\n

函数 serde_json::from_slice 声明:

\n\n
pub fn from_slice<'a, T>(v: &'a [u8]) -> Result<T>\nwhere\n    T: de::Deserialize<'a>\n
Run Code Online (Sandbox Code Playgroud)\n\n

错误消息:

\n\n
error[E0597]: `dbv` does not live long enough\n   --> libs/block-db/src/index.rs:106:50\n    |\n100 |     fn get<'a, T>(&self, key: &[u8]) -> Result<Option<T>>\n    |            -- lifetime `'a` defined here\n...\n106 |                 let v = serde_json::from_slice(&*dbv)?;\n    |                         -------------------------^^^-\n    |                         |                        |\n    |                         |                        borrowed value does not live long enough\n    |                         argument requires that `dbv` is borrowed for `'a`\n...\n109 |             None => Ok(None),\n    |                - `dbv` dropped here while still borrowed\n\nerror: aborting due to previous erro\n
Run Code Online (Sandbox Code Playgroud)\n

snl*_*lan 11

fn get<T>(&self, key: &[u8]) -> Result<Option<T>>
where
    T: DeserializeOwned,
{
    match self.db.get(key)? {
        Some(ref dbv) => {
            let v = serde_json::from_slice(dbv)?;
            Ok(Some(v))
        }
        None => Ok(None),
    }
}
Run Code Online (Sandbox Code Playgroud)

  • “DeserializeOwned”刚刚解决了 3 个小时的“Box”解决方法,谢谢 (2认同)