Rust中的谓词是什么?

5
当我尝试编译这段代码时:
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
请提供一个完整的 [mcve]。 - Stargateur
1个回答

4

V: VisibleElement 在这个上下文中的一个谓词。问题在于,谓词没有足够地约束类型,使得V在任何情况下都不相关。

编译器看到了VV: VisibleElement,但它们对以下内容没有影响:

  • 您正在实现哪个特性(impl trait
  • 或者您要为哪种类型实现该特性(self type
  • 或者对其中任何一个的约束(predicates或bounds)

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

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

我对这里的类型进行了编造,因为我不知道实际类型是什么。这是使用 V 的有意义之处,因为它将 S 约束为不仅是 StoredElement,而且是其关联的 ChildType 实现了 VisibleElementStoredElement。这只会在满足该条件(谓词)的情况下定义 DatabaseStorage 实现。
编译器发出警告,因为您添加了一个没有任何影响并且很可能是您的错误的参数。

1
太棒了,非常感谢!我认为文档应该更清晰明了;我以为我已经足够地限制了 V,并且得出谓词必须是其他东西的结论。我没有想到我所做的对编译器并不是很有帮助。 - left4bread

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接