lef*_*ead 5 generics terminology traits rust
当我尝试编译这段代码时:
impl<S, V> Storage for Database<S>
where
S: StoredElement,
V: VisibleElement,
Run Code Online (Sandbox Code Playgroud)
编译器抱怨
impl<S, V> Storage for Database<S>
where
S: StoredElement,
V: VisibleElement,
Run Code Online (Sandbox Code Playgroud)
我假设V: VisibleElement是一个谓词,但显然编译器不同意。
那么,在 Rust 中,谓词到底是什么?
V: VisibleElement 是这个上下文中的谓词。问题在于谓词没有充分限制类型以使其V以任何方式相关。
编译器会看到V和V: VisibleElement,然后将它们丢弃,因为它们对以下内容没有影响:
impl trait)self type)predicates或边界)。例如,如果谓词包含V和Sthen 之间的关系,那么这就有意义,因为它将添加有关此处定义的实现的信息。例如,可能是这样的:
impl<S, V> Storage for Database<S>
where
S: StoredElement<ChildType = V>,
V: VisibleElement,
Run Code Online (Sandbox Code Playgroud)
我在这里编写了类型,因为我不知道实际类型来自哪里。这将是 的一个有意义的用法,V因为它S不仅限制了StoredElement,而且还StoredElement限制了其关联的ChildType实现VisibleElement。这只会定义 满足条件(谓词)的Storagefor的实现。Database
编译器会抱怨,因为您添加了一个没有任何影响的参数,并且这很可能是您的错误。