我在函数内部有一个新分配的String
,我需要创建一个从&str
借用String
的派生对象,并返回给定的对象。
我知道我的代码是错误的,因为String
生命周期是函数的生命周期,所以派生对象永远不会因为悬空引用而返回。
这里的惯用解决方案是什么?我无法更改serde_json::from_str
#[inline]
pub fn get_object<'a, T>(json_data: &'a Value, path: &[&str]) -> Option<T>
where T: serde::Deserialize<'a>
{
let mut pointer_str = String::new();
for entry in path.iter() {
pointer_str = format!("{}/{}", pointer_str, entry);
}
let child = json_data.pointer(&pointer_str).unwrap().to_string();
let result = serde_json::from_str(&child).ok();
return result;
}
错误:
error: `child` does not live long enough
--> src/lib.rs:88:40
|
88 | let result = serde_json::from_str(&child).ok();
| ^^^^^ does not live long enough
89 | return result;
90 | }
| - borrowed value only lives until here
答案 0 :(得分:3)
惯用解决方案是:
T
实施DeserializeOwned
,T
。前者当然要容易得多。