借用的值在 Result - Map 的通用结构中的生存时间不够长

Borrowed value does not live long enough in a generic struct in Result - Map

impl<'a, T> ClientDBMain<T>
where
    T: FromRow<'a, PgRow>,
{
    async fn query_one(&self, pool: &PgPool, query_raw: &str) -> Result<T, MyError> {
        let res = sqlx::query(query_raw)
            .fetch_one(pool)
            .await
            .map(|r: PgRow| {
                // error here
                T::from_row(&r).unwrap()
            })
            .map_err(|err| {
                // to save for brevity
            })?;
        Ok(res)
    }
}

rmap() 中的寿命不够长。

r的寿命是多少?

如何解决这个问题?通过强制延长生命周期,至少 a?有什么办法可以解决吗?

r 似乎有一个 'static 生命周期,但是由于它没有移动,它将在 map 结束时超出范围时被丢弃。问题是 FromRow 可能会产生一个引用 r 的值,这意味着它不能超过 r。由于它似乎是通过 'a 执行此操作的方式,因此您可以通过要求 T: FromRow<'static, PgRow> 来解决此问题。如果生成的类型具有 'static 生命周期,那么它将不依赖于 r.

的生命周期
impl<T> ClientDBMain<T>
where
    T: FromRow<'static, PgRow>,
{
    async fn query_one(&self, pool: &PgPool, query_raw: &str) -> Result<T, MyError> {
        let res = sqlx::query(query_raw)
            .fetch_one(pool)
            .await
            .map(|r: PgRow| {
                // error here
                T::from_row(&r).unwrap()
            })
            .map_err(|err| {
                // to save for brevity
            })?;
        Ok(res)
    }
}

您几乎肯定想要使用 higher-ranked 特征界限:

impl<T> ClientDBMain<T>
where
    T: for<'a> FromRow<'a, PgRow>,
    // ^^^^^^^
{
    async fn query_one(&self, pool: &PgPool, query_raw: &str) -> Result<T, MyError> {
        ...

您的原始代码表明,如果该行具有特定的生命周期,则 T 只能从 PgRow 生成。外部生命周期不适合 r ,它只存在于该闭包中。相反,for<'a> 引入了通用生命周期,本质上是说 T 实现了任何生命周期的 FromRow