跳转至

Lifetime 问题

serde_json::from_slice

async fn get<'a, T, D>(&self, url: Url, params: &T) -> Result<D>
where
    T: Serialize + ?Sized, D: Deserialize<'a> {
    let response = self.inner.get(url)
        .query(params)
        .send()
        .await?;
    let data = response.bytes().await?;
    match serde_json::from_slice::<D>(&data[..]) {
        Ok(content) => Ok(content),
        Err(e) => panic!("{}", e)
    }
}

解决:stackoverflow 中提到有个 serde issue891,使用 DeserializeOwned 替换 Deserialize<'a>

这是一个很典型的 lifetime 问题,stackoverflow 下面的回答说的比较清楚了,使用 D: Deserialize<'a> 意味着存在生命周期的限制,由调用者决定,而前面所生成的 data 会在该函数作用域结束后被回收,并不满足这个周期条件;而使用 DeserializeOwned,表示由被调用者决定,可以满足任何生命周期条件。原文中一句话很关键:"Usually this is because the data that is being deserialized from is going to be thrown away before the function returns, so T must not be allowed to borrow from it."

除了用 DeserializeOwned 表示任意生命周期,也可以使用 for<'a> D: Deserialize<'a> Higher-Rank Trait Bounds (HRTBs) 限定。

文档-Trait bounds


最后更新: February 3, 2023 15:47:26
创建日期: February 2, 2023 15:14:15

评论