Rust 创建返回实现serde::反序列化的值的函数时发生生存期错误

Rust 创建返回实现serde::反序列化的值的函数时发生生存期错误,rust,lifetime,serde,serde-json,Rust,Lifetime,Serde,Serde Json,我使用serde和serde_json 1.0解码base64字符串中的数据: fn from_base64_str<T: Deserialize>(string: &str) -> T { let slice = decode_config(string, URL_SAFE).unwrap(); serde_json::from_slice(&slice).unwrap() } 所以我加上了生命: fn from_base64_st

我使用serde和serde_json 1.0解码base64字符串中的数据:

fn from_base64_str<T: Deserialize>(string: &str) -> T {
    let slice = decode_config(string, URL_SAFE).unwrap();     
    serde_json::from_slice(&slice).unwrap()
}
所以我加上了生命:

fn from_base64_str<'de, T: Deserialize<'de>>(string: &str) -> T {
    let slice = decode_config(string, URL_SAFE).unwrap();     
    serde_json::from_slice(&slice).unwrap()
}
fn from\u base64\u str>(字符串:&str)->T{
let slice=decode_config(字符串,URL_SAFE).unwrap();
serde_json::from_slice(&slice).unwrap()
}
然后编译器告诉我:

错误:`slice`的寿命不够长
-->src/main.rs:11:29
|
11 | serde_json::from_slice(&slice).unwrap()
|^^^^^^^活得不够长
12 | }
|-借来的价值仅在此处有效
|
注意:借用值必须在正文9:64定义的“de”生存期内有效。。。
-->src/main.rs:9:65
|
9 | fn from_base64_str>(字符串:&str)->T{
|从这里开始。。。
10 | | let slice=decode_config(字符串,URL_SAFE).unwrap();
11 | | serde_json::from_slice(&slice).unwrap()
12 | | }
|| u^……到此结束
我只知道Rust中最基本的生命周期,所以我对trait反序列化中的de感到非常困惑

如何修复此类函数中的生存期错误?我每晚都在使用Rust 1.18.0(452bf0852 2017-04-19)

我从中找到答案:我应该使用
反序列化
而不是
反序列化

我从中找到答案:我应该使用
反序列化
而不是
反序列化


有两种主要的方法来编写
反序列化
特征边界,无论是在impl块、函数还是其他任何地方

  • 这意味着“T可以从某个生存期反序列化。”调用者可以决定这是什么生存期。通常,当调用方还提供从中进行反序列化的数据时(例如在函数中),会使用这种方法。在这种情况下,输入数据还必须具有生存期
    'de
    ,例如,它可以是
    &'de str

  • 其中T:DeserializeOwned

    这意味着“T可以从任何生存期反序列化。”被调用方可以决定什么生存期。通常这是因为从中反序列化的数据将在函数返回之前被丢弃,因此不能允许T从中借用。例如,一个函数接受base64编码的数据作为输入,从base64对其进行解码,反序列化T类型的值,然后丢弃base64解码的结果。此绑定的另一个常见用途是从IO流进行反序列化的函数,例如

    更严格地说,这个特征相当于
。唯一的区别是
反序列化拥有的
更直观。这意味着T拥有所有反序列化的数据


有两种主要的方法来编写
反序列化
特征边界,无论是在impl块、函数还是其他任何地方

  • 这意味着“T可以从某个生存期反序列化。”调用者可以决定这是什么生存期。通常,当调用方还提供从中进行反序列化的数据时(例如在函数中),会使用这种方法。在这种情况下,输入数据还必须具有生存期
    'de
    ,例如,它可以是
    &'de str

  • 其中T:DeserializeOwned

    这意味着“T可以从任何生存期反序列化。”被调用方可以决定什么生存期。通常这是因为从中反序列化的数据将在函数返回之前被丢弃,因此不能允许T从中借用。例如,一个函数接受base64编码的数据作为输入,从base64对其进行解码,反序列化T类型的值,然后丢弃base64解码的结果。此绑定的另一个常见用途是从IO流进行反序列化的函数,例如

    更严格地说,这个特征相当于
。唯一的区别是
反序列化拥有的
更直观。这意味着T拥有所有反序列化的数据

fn from_base64_str<'de, T: Deserialize<'de>>(string: &str) -> T {
    let slice = decode_config(string, URL_SAFE).unwrap();     
    serde_json::from_slice(&slice).unwrap()
}