関数がSerde Deserialize型を返す場合のライフタイムエラーを修正するにはどうすればいいですか? 質問する

関数がSerde Deserialize型を返す場合のライフタイムエラーを修正するにはどうすればいいですか? 質問する

私は 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()
}

コンパイルすると、次のようになります:

error[E0106]: missing lifetime specifier
 --> src/main.rs:6:23
  |
6 | fn from_base64_str<T: Deserialize>(string: &str) -> T {
  |                       ^^^^^^^^^^^ expected lifetime parameter

serde ドキュメントを確認すると、Deserialize次のように定義されています。

pub trait Deserialize<'de>: Sized {

そこで私はライフタイムを追加しました:

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()
}

するとコンパイラーは私にこう言いました:

error: `slice` does not live long enough
  --> src/main.rs:11:29
   |
11 |     serde_json::from_slice(&slice).unwrap()
   |                             ^^^^^ does not live long enough
12 | }
   | - borrowed value only lives until here
   |
note: borrowed value must be valid for the lifetime 'de as defined on the body at 9:64...
  --> src/main.rs:9:65
   |
9  |   fn from_base64_str<'de, T: Deserialize<'de>>(string: &str) -> T {
   |  _________________________________________________________________^ starting here...
10 | |     let slice = decode_config(string, URL_SAFE).unwrap();
11 | |     serde_json::from_slice(&slice).unwrap()
12 | | }
   | |_^ ...ending here

私は Rust 1.18.0-nightly (452bf0852 2017-04-19) を使用しています。私は Rust のライフタイムについてごく基本的なことしか知らないので、'deinについては非常に混乱していますtrait Deserialize

このような関数の有効期間エラーを修正するにはどうすればよいでしょうか?

ベストアンサー1

答えを見つけたセルデ第891号:DeserializeOwnedの代わりにを使用する必要がありますDeserialize

おすすめ記事