Rust 中的谓词是什么?
What is a predicate in Rust?
当我尝试编译这段代码时:
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 中,谓词到底是什么?
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
.这只会为 Database
定义满足条件(谓词)的 Storage
的实现。
编译器报错是因为您添加了一个没有任何影响的参数,这很可能是您的错误。
当我尝试编译这段代码时:
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 中,谓词到底是什么?
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
.这只会为 Database
定义满足条件(谓词)的 Storage
的实现。
编译器报错是因为您添加了一个没有任何影响的参数,这很可能是您的错误。