我在一个函数中有一个新分配的 String
,我需要创建一个从 String
借用 &str
的派生对象,然后返回给定的对象。
我知道我的代码是错误的,因为 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
最佳答案
惯用的解决方案是:
- 让
T
实现DeserializeOwned
, - 有两种方法,一种是创建字符串,一种是反序列化,并保证反序列化后的结果存储时间大于
T
。
当然,前者要容易得多。
关于memory-management - 当使用将在函数末尾删除的字符串调用时,如何返回 serde_json::from_str 的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44178168/