首页 > 解决方案 > 如何在泛型/嵌套结构中省略顶级类型参数?

问题描述

我想创建一个可以像这样使用的数据库结构:

let c: Database<Disk<u8>> = ...

但是,当我天真地实现它时:

trait Element {}

trait Storage<E> where E: Element {}

struct Disk<E> where E: Element {
    data: E,
}  

impl<E> Storage<E> for Disk<E> where E: Element {}

struct Database<S>
where
    S: Storage<E>, 
    E: Element,
{
    storage: S,
}

我收到一个E未知的错误:

error[E0412]: cannot find type `E` in this scope
  --> src/main.rs:30:16
   |
30 |     S: Storage<E>, // <-- Error: E not found.
   |                ^ did you mean `Eq`?

操场

我显然可以E明确表示,例如:

struct DatabaseUgly<S, E>
where
    S: Storage<E>,
    E: Element 

但随后我将不得不重复元素类型:

let c: DatabaseUgly<Disk<u8>, u8> = ...

我怎样才能Database工作?


注意:由于它发生了不止一次,请不要在没有先讨论的情况下编辑我的问题的标题。我可能没有使用正确的术语,但如果我知道究竟要寻找什么,我可能不会以这种方式询问/搜索。

标签: rust

解决方案


一个简单的解决方案是在 trait 中使用关联类型,而不是泛型:

trait Element {}

trait Storage { // not generic
    type Element: Element;
}

struct Disk<E>
where
    E: Element,
{
    data: E,
}

impl<E> Storage for Disk<E>
where
    E: Element,
{
    type Element = E;
}

struct Database<S>
where
    S: Storage,
    S::Element: Element,
{
    storage: S,
}

游乐场链接

另请参阅何时使用关联类型与泛型类型比较合适?


推荐阅读