Я пытаюсь добавить нумерацию страниц, используя дизель.Компилятор может проверять границы универсального типа, если я использую функцию, но нет, если я пытаюсь сделать то же самое, что и реализация признака.
Это простой рабочий пример:
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.