首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLx和reference的通用特性

SQLx和reference的通用特性
EN

Stack Overflow用户
提问于 2020-11-27 07:52:18
回答 1查看 199关注 0票数 1

我已经创建了一个泛型特征,并且正在sqlx查询中实现它,但是我得到了一个错误

我做错了什么?

代码语言:javascript
复制
#[async_trait]
pub trait ITodoRepo<P> {
    async fn list(pool:&P) -> Result<Vec<TodoType>>;
   
}
代码语言:javascript
复制
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?

代码语言:javascript
复制
error[E0637]: `'_` cannot be used here
 --> src/todo.rs:21:24
   |
21 |             .fetch_all(pool)
   |                        ^^^^ the trait `sqlx::Executor<'_>` is not implemented for `&P`
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-27 08:21:07

在您的问题中,根据fn list(pool: &P)pool的类型是&P。但是fetch_all()方法似乎需要一个实现特征sqlx::Executor<'_>的参数。根据您的实现,P实现了该特性,但&P没有。

以下是您的问题的最小可重现代码:

代码语言:javascript
复制
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);
}

Playground

基本上,您的函数需要一个实现某些特征MyTrait的类型T,但您传递的是&T

要解决此问题,您可以更改为函数以接受引用。如上例所示:

代码语言:javascript
复制
fn func<T: MyTrait>(arg: &T) {
    todo!()
}

Playground

或者,您可以为引用本身实现特征:

代码语言:javascript
复制
impl MyTrait for &MyStruct {}

Playground

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65030533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档