Rust中的谓词是什么?

时间:2018-09-13 17:12:50

标签: generics rust traits terminology

当我尝试编译此代码时:

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中,谓词究竟是什么?

1 个答案:

答案 0 :(得分:3)

V: VisibleElement 在这种情况下的谓词。问题在于谓词不能充分约束类型V才能以任何方式相关。

编译器会看到VV: VisibleElement,然后将它们丢弃,因为它们对以下内容没有影响:

  • 您要实现的特征(impl trait
  • 或您要实现特征的类型(self type
  • 或其中任何一个约束(predicates或界限)。

例如,如果谓词包括VS之间的关系,那将是有道理的,因为它将添加有关此处定义了哪些实现的信息。例如,可能是这样的:

impl<S, V> Storage for Database<S>
where
    S: StoredElement<ChildType = V>,
    V: VisibleElement,

我在这里构成了类型,因为我不知道实际类型来自哪里。这将是V的有意义的用法,因为它不仅将S约束为StoredElement,而且约束了StoredElement且其关联的ChildType实现了VisibleElement 。这只会为满足条件(谓词)的Storage定义Database的实现。

编译器在抱怨,因为您添加了一个没有任何影响的参数,而这很可能是您的错误。