Rust жалуется на срок службы метода, который я пишу

Я изо всех сил пытаюсь изучить Rust всю свою жизнь. Поэтому я делаю метод ниже в оболочке веб-клиента.

pub async fn get_as_bytes<T: serde::Deserialize>(
    &self,
    url: &str,
    headers: Option<HeaderMap>,
) -> Result<T, Box<dyn Error>> {
    let mut req = self.reqwest_client.request(reqwest::Method::GET, url);

    if let Some(hds) = headers {
        req = req.headers(hds);
    }

    let resp: Response = req.send().await?;
    let full = resp.bytes().await?;

    let result = serde_json::from_slice(&full).unwrap();
    Ok(result)
}

Когда я пытаюсь скомпилировать, я получаю следующее:

error[E0106]: missing lifetime specifier
  --> src/webclient.rs:53:41
   |
53 |     pub async fn get_as_bytes<T: serde::Deserialize>(&self, url: &str, headers: Option<HeaderMap>) -> Result<T, Box<dyn Error>> {
   |                                         ^^^^^^^^^^^ expected named lifetime parameter
   |
help: consider introducing a named lifetime parameter
   |
53 |     pub async fn get_as_bytes<'a, T: serde::Deserialize<'a>>(&self, url: &str, headers: Option<HeaderMap>) -> Result<T, Box<dyn Error>> {
   |                               ^^^           ^^^^^^^^^^^^^^^

error[E0597]: `full` does not live long enough
  --> src/webclient.rs:63:45
   |
63 |         let result = serde_json::from_slice(&full).unwrap();
   |                      -----------------------^^^^^-
   |                      |                      |
   |                      |                      borrowed value does not live long enough
   |                      argument requires that `full` is borrowed for `'static`
64 |         Ok(result)
65 |     }
   |     - `full` dropped here while still borrowed

Как мне сделать &full последним, так как я пытаюсь его вернуть?


person Lucas Bataglião    schedule 25.11.2020    source источник
comment
Трудно ответить на ваш вопрос, потому что он не включает минимально воспроизводимый пример. Мы не можем сказать, какие крейты (и их версии), типы, трейты, поля и т. д. присутствуют в коде. Нам будет легче помочь вам, если вы попытаетесь воспроизвести ошибку на Rust Playground, если возможно, в противном случае в новом проекте Cargo отредактируйте свой вопрос, чтобы включить дополнительную информацию. Существуют советы по MRE для Rust, которые вы можете использовать, чтобы уменьшить исходный код для публикации здесь. Спасибо!   -  person Shepmaster    schedule 25.11.2020
comment
Похоже, на ваш вопрос могут ответить ответы пожизненной ошибки при создании функции, возвращающей значение, реализующее serde::Deserialize. Если нет, отредактируйте свой вопрос, чтобы объяснить различия. В противном случае мы можем пометить этот вопрос как уже отвеченный.   -  person Shepmaster    schedule 25.11.2020
comment
@Shepmaster, ты попал в точку. Большое спасибо   -  person Lucas Bataglião    schedule 25.11.2020


Ответы (1)


Просто публикую как ссылку на будущее, а не удаляю вопрос. Как упоминает @Shepmaster в комментарии к вопросу, que пожизненная ошибка при создании функции, возвращающей значение, реализующее serde::Deserialize решает вопрос. Как и в документации, код будет таким:

pub async fn get_as_bytes<T: serde::de::DeserializeOwned >(&self, url: &str, headers: Option<HeaderMap>) -> Result<T, Box<dyn Error>> {
        let mut req = self.reqwest_client.request(reqwest::Method::GET, url);

        if let Some(hds) = headers {
            req = req.headers(hds);
        }

        let resp: Response = req.send().await?;
        let full = resp.bytes().await?;

        let result = serde_json::from_slice(&full).unwrap();
        Ok(result)
    }
    ```
person Lucas Bataglião    schedule 25.11.2020
comment
Нет необходимости дублировать ответы или удалять вопросы. Вот почему мы помечаем вещи как дубликаты. - person Shepmaster; 25.11.2020