Rust 中的谓词是什么?

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

Pet*_*all 4

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

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