我想创建一个可以像这样使用的数据库结构:
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
工作?
注意:由于发生了多次,因此请请勿在未进行讨论的情况下编辑问题的标题。我可能没有使用正确的术语,但是如果我确切知道要寻找什么,我可能就不会这样询问/搜索。
答案 0 :(得分:3)
一个简单的解决方案是在特征中使用关联类型,而不是通用类型:
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,
}
另请参阅When is it appropriate to use an associated type versus a generic type?