Rust 推断类型构造函数的类型

Rust 推断类型构造函数的类型,rust,traits,associated-types,rust-diesel,Rust,Traits,Associated Types,Rust Diesel,这似乎是一个具体的问题,但我会尽可能地概括它。请随意编辑标题,因为我有点生疏,不知道如何简洁地表达它 我想做的最好用例子来解释 我正在使用diesel并生成了schema.rs,它定义了表Cats和Dogs(使用表!宏) 现在我为Cat和Dog编写了get\u所有的函数(我实现了两个结构) 此操作失败,需要1个类型参数 我的方法是否有“修复”(例如编译器自动推断类型)或设计是否被破坏?如果是后者,我如何推广get\u all方法 PS:Queryable特征也是如此,它应该是T的一个约束,但同样

这似乎是一个具体的问题,但我会尽可能地概括它。请随意编辑标题,因为我有点生疏,不知道如何简洁地表达它

我想做的最好用例子来解释

我正在使用diesel并生成了
schema.rs
,它定义了表
Cats
Dogs
(使用
表!
宏)

现在我为
Cat
Dog
编写了
get\u所有的
函数(我实现了两个结构)

此操作失败,需要1个类型参数

我的方法是否有“修复”(例如编译器自动推断类型)或设计是否被破坏?如果是后者,我如何推广
get\u all
方法


PS:Queryable
特征也是如此,它应该是
T
的一个约束,但同样需要两个类型参数。

您的特征似乎需要关联的类型。这使您可以表示这样一个事实,即数据结构具有与之关联的唯一资源类型

trait GetAll {
    type Resource; 
    fn get_all(conn: &PgConnection) -> Vec<Self> {
        Self::Resource::load::<Self>(conn)
    }
}

impl GetAll for Dog {
    type Resource = Dogs;
}

impl GetAll for Cat {
    type Resource = Cats;
}

你能提供猫和狗的定义吗?它们是非常不相关的,但是pub-Struct-Cat{pub-id:Uuid}
和pub-Struct-Dog{pub-id:Uuid}应该足够了。好主意,但是资源不是一种类型,如果我理解正确,它是diesel::query_dsl::RunQueryDsl的一个实例。不过我可以做
类型资源
然后在
get_resource()->resource
,对吗?nvm的方法签名中使用此类型。我仍然需要告诉编译器,
Resource
有一个方法
.load()
,因此我需要再次约束它,这是我首先遇到的问题。@KillPinguin我认为您需要提供有关所有类型的更多信息。
trait GetAll<T=Self> {
   fn get_all(conn: &PgConnection) -> Vec<T> {
      Resource.load::<T>(conn)
   }
}
trait GetAll<T=Self> {
   fn get_resource() -> diesel::query_dsl::RunQueryDsl;

   fn get_all(conn: &PgConnection) -> Vec<T> {
      get_resource().load::<T>(conn)
   }
}
trait GetAll {
    type Resource; 
    fn get_all(conn: &PgConnection) -> Vec<Self> {
        Self::Resource::load::<Self>(conn)
    }
}

impl GetAll for Dog {
    type Resource = Dogs;
}

impl GetAll for Cat {
    type Resource = Cats;
}
let dogs = Dog::get_all(&conn);
let cats = Cat::get_all(&conn);