snl*_*lan 6 lifetime rust serde-json
使用通用生命周期\xe3\x80\x82时借用的值没有足够长的寿命
\n\nfn 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}\nRun Code Online (Sandbox Code Playgroud)\n\n函数 db.get 声明:
\n\npub fn get(&self, key: &[u8]) -> Result<Option<DBVector>, String>\nRun Code Online (Sandbox Code Playgroud)\n\n函数 serde_json::from_slice 声明:
\n\npub fn from_slice<'a, T>(v: &'a [u8]) -> Result<T>\nwhere\n T: de::Deserialize<'a>\nRun Code Online (Sandbox Code Playgroud)\n\n错误消息:
\n\nerror[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\nRun 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)