struct S1<T>
{
pub data: T
}
impl<'a, T> S1<T> where T: Deserialize<'a> {
fn update() {
let str_json = String::new(); // let's assume read from file
self.data = serve_json::from_str(&str_json).unwrap();
}
}
由于不正确的说明符,该函数将产生与生命周期相关的问题。克服这个问题的最好方法是什么?Deserialize
不一定创建str_json
数据的副本。在str_json
中可能有大的文本部分在最终的T
中被引用,而不是被复制到它中。这意味着,最终self.data
的生命周期与str_json
的生命周期相同,因为它可能会从str_json
借用数据。这也是为什么必须首先指定生存期'a
的原因。
现在在您的情况下,问题是self.data
被存储在self
中,而str_json
在update()
的末尾被删除。但是self.data
可能仍然引用str_json
的数据,所以编译器有理由抱怨。
我认为你真正想要实现的是str_json
的数据被复制到self.data
中,而不仅仅是被引用。对于这种行为,你有错误的特征,你真正想要的是DeserializeOwned
:
use serde::de::DeserializeOwned;
struct S1<T> {
pub data: T,
}
impl<T> S1<T>
where
T: DeserializeOwned,
{
fn update(&mut self) {
let str_json = String::new(); // let's assume read from file
self.data = serde_json::from_str(&str_json).unwrap();
}
}