当我尝试编译此代码时:
impl<S, V> Storage for Database<S>
where
S: StoredElement,
V: VisibleElement,
编译器抱怨
error[E0207]: the type parameter `V` is not constrained by the impl trait, self type, or predicates
--> src/main.rs:77:9
|
77 | impl<S, V> Storage for Database<S>
| ^ unconstrained type parameter
我假设V: VisibleElement
是一个谓词,但是显然编译器不同意。
那么,在Rust中,谓词究竟是什么?
答案 0 :(得分:3)
V: VisibleElement
是在这种情况下的谓词。问题在于谓词不能充分约束类型V
才能以任何方式相关。
编译器会看到V
和V: VisibleElement
,然后将它们丢弃,因为它们对以下内容没有影响:
impl trait
)self type
predicates
或界限)。例如,如果谓词包括V
和S
之间的关系,那将是有道理的,因为它将添加有关此处定义了哪些实现的信息。例如,可能是这样的:
impl<S, V> Storage for Database<S>
where
S: StoredElement<ChildType = V>,
V: VisibleElement,
我在这里构成了类型,因为我不知道实际类型来自哪里。这将是V
的有意义的用法,因为它不仅将S
约束为StoredElement
,而且约束了StoredElement
且其关联的ChildType
实现了VisibleElement
。这只会为满足条件(谓词)的Storage
定义Database
的实现。
编译器在抱怨,因为您添加了一个没有任何影响的参数,而这很可能是您的错误。