如何在使用将在函数末尾删除的String调用时返回serde_json :: from_str的结果?

时间:2017-05-25 10:26:47

标签: memory-management rust lifetime

我在函数内部有一个新分配的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

1 个答案:

答案 0 :(得分:3)

惯用解决方案是:

  • 改为T实施DeserializeOwned
  • 有两个方法:一个用于创建字符串,另一个用于反序列化,并确保反序列化结果的存储时间长于T

前者当然要容易得多。