我正在尝试使用Diesel添加分页。如果我使用函数,则编译器能够检查泛型类型的边界,但是如果我尝试与特征实现相同,则编译器将无法检查。
这是一个简单的工作示例:
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
是Diesel的特征,它提供方法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
上的条件,但尚不清楚具有相同条件的简单函数有什么区别。
我正在使用Rust 1.35.0和Diesel 1.4。
答案 0 :(得分:1)
我无法回答为什么。我可以说在特质定义上重复边界会编译:
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);
}
}
您可能还对extending Diesel guide感兴趣,它讨论了如何最好地添加paginate
方法。