借用的值在 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)
}
}
r
在 map()
中的寿命不够长。
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
。
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)
}
}
r
在 map()
中的寿命不够长。
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
。