Почему я получаю «переполнение, оценивающее требование», когда переписываю функцию, используя черты Дизеля, в метод черты? - PullRequest
2 голосов
/ 28 мая 2019

Я пытаюсь добавить нумерацию страниц, используя дизель.Компилятор может проверять границы универсального типа, если я использую функцию, но нет, если я пытаюсь сделать то же самое, что и реализация признака.

Это простой рабочий пример:

use diesel::query_dsl::methods::{LimitDsl, OffsetDsl};

pub fn for_page<T>(query: T)
where
    T: OffsetDsl,
    T::Output: LimitDsl,
{
    query.offset(10).limit(10);
}

OffsetDsl и LimitDsl - признаки Дизеля, которые предоставляют методы offset и limit.

Когда я пытаюсь извлечь этот метод как черту и реализовать его следующим образом

use diesel::query_dsl::methods::{LimitDsl, OffsetDsl};

trait Paginator {
    fn for_page(self);
}

impl<T> Paginator for T
where
    T: OffsetDsl,
    <T as OffsetDsl>::Output: LimitDsl,
{
    fn for_page(self) {
        self.offset(10).limit(10);
    }
}

я получаю не очень четкое сообщение об ошибке.

error[E0275]: overflow evaluating the requirement `<Self as diesel::query_dsl::offset_dsl::OffsetDsl>::Output`
 --> src/main.rs:3:1
  |
3 | / trait Paginator {
4 | |     fn for_page(self);
5 | | }
  | |_^
  |
  = note: required because of the requirements on the impl of `Paginator` for `Self`
note: required by `Paginator`
 --> src/main.rs:3:1
  |
3 | trait Paginator {
  | ^^^^^^^^^^^^^^^

error[E0275]: overflow evaluating the requirement `<Self as diesel::query_dsl::offset_dsl::OffsetDsl>::Output`
 --> src/main.rs:4:5
  |
4 |     fn for_page(self);
  |     ^^^^^^^^^^^^^^^^^^
  |
  = note: required because of the requirements on the impl of `Paginator` for `Self`
note: required by `Paginator`
 --> src/main.rs:3:1
  |
3 | trait Paginator {
  | ^^^^^^^^^^^^^^^

Я понимаю, что это означает, что компилятор не может проверить условие на T::Output, но не ясно, в чем отличие простой функции с таким же условием.

Iиспользую Rust 1.35.0 и Diesel 1.4.

1 Ответ

1 голос
/ 28 мая 2019

Я не могу ответить , почему они отличаются.Я могу сказать, что повторение границ определения черты компилируется:

use diesel::query_dsl::methods::{LimitDsl, OffsetDsl};

trait Paginator
where
    Self: OffsetDsl,
    Self::Output: LimitDsl,
{
    fn for_page(self);
}

impl<T> Paginator for T
where
    T: OffsetDsl,
    T::Output: LimitDsl,
{
    fn for_page(self) {
        self.offset(10).limit(10);
    }
}

Возможно, вас также заинтересует расширяющее руководство по дизелю , в котором обсуждается, как лучше всего добавить метод paginate..

...