我已经创建了一个泛型特征,并且正在sqlx查询中实现它,但是我得到了一个错误
我做错了什么?
#[async_trait]
pub trait ITodoRepo<P> {
async fn list(pool:&P) -> Result<Vec<TodoType>>;
}pub struct TodoRepo;
#[async_trait]
impl<P: sqlx::Executor<'static, Database = sqlx::Postgres>> ITodoRepo<P> for TodoRepo {
async fn list(pool: &P) -> Result<Vec<TodoType>> {
let rowset = sqlx::query_as!(
TodoSchema,
r#"SELECT * FROM todo"#)
.fetch_all(pool)
.await?
.iter()
.map(|row| hydrate(row))
.collect();
Ok(rowset)
}
}如何实现Executor?
error[E0637]: `'_` cannot be used here
--> src/todo.rs:21:24
|
21 | .fetch_all(pool)
| ^^^^ the trait `sqlx::Executor<'_>` is not implemented for `&P`发布于 2020-11-27 08:21:07
在您的问题中,根据fn list(pool: &P),pool的类型是&P。但是fetch_all()方法似乎需要一个实现特征sqlx::Executor<'_>的参数。根据您的实现,P实现了该特性,但&P没有。
以下是您的问题的最小可重现代码:
trait MyTrait {}
struct MyStruct;
impl MyTrait for MyStruct {}
fn func<T: MyTrait>(arg: T) {
todo!()
}
fn main() {
let var = MyStruct;
let ref_to_var = &var;
func(ref_to_var);
}基本上,您的函数需要一个实现某些特征MyTrait的类型T,但您传递的是&T。
要解决此问题,您可以更改为函数以接受引用。如上例所示:
fn func<T: MyTrait>(arg: &T) {
todo!()
}或者,您可以为引用本身实现特征:
impl MyTrait for &MyStruct {}https://stackoverflow.com/questions/65030533
复制相似问题