为什么可变借用会修复预期的特征实现?
Why does mutably borrowing fix an expected trait implementation?
我正在使用 rust sqlx,我正在从我的数据库池中获取连接以进行查询:
POOL: OnceCell<Pool<Postgres>> = OnceCell::new();
pub async fn get_connection() -> PoolConnection<Postgres> {
POOL.get().unwrap().acquire().await.unwrap()
}
pub async fn fetch_users() -> Result<Vec<User>> {
let result = sqlx::query_as!(User,
r#"SELECT * FROM users"#)
.fetch_all(get_connection().await).await?;
Ok(result)
}
但是 get_connection().await
给我一个错误:
the trait bound `sqlx::pool::PoolConnection<sqlx::Postgres>: sqlx::Executor<'_>` is not satisfied expected an implementor of trait `sqlx::Executor<'_>`
编译器告诉我通过 using consider mutably borrowing here: `&mut`
进行修复,当我更改为 &mut get_connection().await
.
时工作正常
我不明白为什么这样可以解决问题。谁能解释一下?
查看 sqlx::Executor
的 implementations,它们都属于某种 &mut T
类型。它是为 &mut PoolConnection<Postgres>
而不是 PoolConnection<Postgres>
实现的。
添加 &mut
会将其从传递 PoolConnection<Postgres>
更改为 &mut PoolConnection<Postgres>
。这是必需的,因为 Rust 没有 auto-borrow 函数参数。
我正在使用 rust sqlx,我正在从我的数据库池中获取连接以进行查询:
POOL: OnceCell<Pool<Postgres>> = OnceCell::new();
pub async fn get_connection() -> PoolConnection<Postgres> {
POOL.get().unwrap().acquire().await.unwrap()
}
pub async fn fetch_users() -> Result<Vec<User>> {
let result = sqlx::query_as!(User,
r#"SELECT * FROM users"#)
.fetch_all(get_connection().await).await?;
Ok(result)
}
但是 get_connection().await
给我一个错误:
the trait bound `sqlx::pool::PoolConnection<sqlx::Postgres>: sqlx::Executor<'_>` is not satisfied expected an implementor of trait `sqlx::Executor<'_>`
编译器告诉我通过 using consider mutably borrowing here: `&mut`
进行修复,当我更改为 &mut get_connection().await
.
我不明白为什么这样可以解决问题。谁能解释一下?
查看 sqlx::Executor
的 implementations,它们都属于某种 &mut T
类型。它是为 &mut PoolConnection<Postgres>
而不是 PoolConnection<Postgres>
实现的。
添加 &mut
会将其从传递 PoolConnection<Postgres>
更改为 &mut PoolConnection<Postgres>
。这是必需的,因为 Rust 没有 auto-borrow 函数参数。