memory-management - 当使用将在函数末尾删除的字符串调用时,如何返回 serde_json::from_str 的结果?

标签 memory-management rust lifetime

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

相关文章:

objective-c - 这些内存管理技术中的哪一种在什么情况下更好?

c++ - 哪个指针赋值更好(C++)

memory-management - 分配后TLAB分配的对象是否共享?

rust - 为什么要在类型参数之前声明生命周期参数?

c# - 什么时候(不)两个具有相同内容的字符串共享相同的内存?

rust - 为什么对 Regex::find 的结果进行匹配会提示期望结构 regex::Match 但找到元组?

struct - 我使用什么生命周期来创建循环引用彼此的 Rust 结构?

rust - 了解 Rust 中 "super"关键字的具体用法

rust - 如何在不克隆的情况下对 Vec<(Cow<str>, Cow<str>) by_key 进行排序?

java - 变量的生命周期 : Reference becomes NULL