Что такое предикат в 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?

Пожалуйста, сделайте полный минимальный воспроизводимый пример.

Stargateur 13.09.2018 19:16
3
1
1 010
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Отлично, спасибо большое! Я думаю, что документация должна быть более ясной; Я предположил, что ограничиваю Vдостаточно; а заключенные предикаты должны быть чем-то другим. Мне не приходило в голову, что то, что я делаю, не очень помогает компилятору.

left4bread 13.09.2018 19:27

Другие вопросы по теме