Rust 抱怨我正在编写的方法的生命周期
Rust complaining about lifetime on the method I am writing
我正在为学习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
成为最后一个,因为我正在尝试 return 它?
只是作为将来的参考发布,而不是删除问题。正如@Shepmaster 在问题的评论中提到的那样,que Lifetime error when creating a function that returns a value implementing 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)
}
```
我正在为学习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
成为最后一个,因为我正在尝试 return 它?
只是作为将来的参考发布,而不是删除问题。正如@Shepmaster 在问题的评论中提到的那样,que Lifetime error when creating a function that returns a value implementing 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)
}
```