调用需要字符串切片的方法的 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();
}
我是一个 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();
}