rust - 如何在泛型/嵌套结构中省略顶级类型参数?
问题描述
我想创建一个可以像这样使用的数据库结构:
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
工作?
注意:由于它发生了不止一次,请不要在没有先讨论的情况下编辑我的问题的标题。我可能没有使用正确的术语,但如果我知道究竟要寻找什么,我可能不会以这种方式询问/搜索。
解决方案
一个简单的解决方案是在 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,
}
(游乐场链接)
推荐阅读
- angular - 奇怪的obj标志无缘无故出现
- android - 如何修复“您需要 MANAGE_USERS 或 CREATE_USERS 权限才能:获取与用户 0 相关的配置文件”错误?
- java - 如何避免使用 Hibernate 从 VARCHAR 到 VARCHAR2 的隐式类型转换?
- javascript - 登录时在firebase中添加首次注册用户关系的更好方法是什么?
- oracle-adf - ADF 中的 ApplicationModule 定义类代码为空
- python - 在函数内部未定义值
- python - 使用 os.walk() 循环文件并打开它们
- android - Android PresetReverb 不起作用(Kotlin)
- jquery - 删除aspnet核心mvc中的数据后如何使用jquery延迟3000秒重定向页面
- http - Google FCM 是否已停止接受 HTTP 请求?