Что такое предикат в Rust? - PullRequest
       50

Что такое предикат в Rust?

0 голосов
/ 13 сентября 2018

Когда я пытаюсь скомпилировать этот код:

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 голосов
/ 13 сентября 2018

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 s, связанный ChildType реализует VisibleElement. Это будет определять только реализацию Storage для Database, где выполняется это условие (предикат).

Компилятор жалуется, потому что вы добавили параметр, который не оказывает никакого влияния и который, скорее всего, будет ошибкой с вашей стороны.

...