调用需要字符串切片的方法的 Rust 方法是什么

What is the Rust way to call a method requireing a string slice from a String

我是一个 Rust 初学者(但经验丰富的程序员),我正在尝试创建一个简单的实用函数来从 json 文件中读取数据,但显然缺少重要的 Rust 理解来提取它离开。我环顾四周,但无法解决其他生锈问题。我正在尝试做这样的事情:

pub fn read_data_from_json<'a, T: Deserialize<'a>, P: AsRef<Path>>(path: P) -> T {
    let result = std::fs::read_to_string(path).unwrap();
    return serde_json::from_str(&result).unwrap();
}

问题是我想为 serde_json::from_str() 提供它需要的 &str,但是通过读取文件得到 String。所以 Rust 编译器说:

40 |     return serde_json::from_str(&result).unwrap();
   |            ---------------------^^^^^^^-
   |            |                    |
   |            |                    borrowed value does not live long enough

原因显然是 result 变量在 from_str() 完成值之前被删除,但我无法获得 'just the slice' 值。我尝试了 as_str()&*&'static str 和其他几个选项来尝试使这项工作有效,但我显然遗漏了一些东西,因为它看起来像是一个基本用例。我必须承认我对 'lifetime' 和涉及的泛型仍然有点模糊,所以问题可能就在那里。

我建议您阅读 serde 手册中的 Understanding deserializer lifetimes。他们在那里建议 T: DeserializeOwned,明确提及您的用例:

Usually this is because the data that is being deserialized from is going to be thrown away before the function returns, so T must not be allowed to borrow from it.

所以解决方案是:

use serde::de::DeserializeOwned;

pub fn read_data_from_json<T: DeserializeOwned, P: AsRef<Path>>(path: P) -> T {
    let result = std::fs::read_to_string(path).unwrap();
    return serde_json::from_str(&result).unwrap();
}