Rust 为什么我会得到;“评估需求的溢出”;使用Diesel';将特征转化为特征方法?

Rust 为什么我会得到;“评估需求的溢出”;使用Diesel';将特征转化为特征方法?,rust,rust-diesel,Rust,Rust Diesel,我正在尝试使用Diesel添加分页。如果我使用函数,编译器能够检查泛型类型的边界,但如果我尝试与trait的实现相同,编译器就无法检查泛型类型的边界 这是一个简单的工作示例: use diesel::query_dsl::methods::{LimitDsl, OffsetDsl}; pub fn for_page<T>(query: T) where T: OffsetDsl, T::Output: LimitDsl, { query.offset(10)

我正在尝试使用Diesel添加分页。如果我使用函数,编译器能够检查泛型类型的边界,但如果我尝试与trait的实现相同,编译器就无法检查泛型类型的边界

这是一个简单的工作示例:

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);
}
我收到一条不太清楚的错误消息

error[E0275]:溢出评估需求`::Output`
-->src/main.rs:3:1
|
3 |/trait Paginator{
4 | | fn为|页(自我);
5 | | }
| |_^
|
=注:由于“Paginator”的impl中对“Self”的要求,因此需要`
注:Paginator要求`
-->src/main.rs:3:1
|
3 |特征分页器{
| ^^^^^^^^^^^^^^^
错误[E0275]:评估需求“:”输出时溢出`
-->src/main.rs:4:5
|
4 | fn为|页(自身);
|     ^^^^^^^^^^^^^^^^^^
|
=注:由于“Paginator”的impl中对“Self”的要求,因此需要`
注:Paginator要求`
-->src/main.rs:3:1
|
3 |特征分页器{
| ^^^^^^^^^^^^^^^
我理解这意味着编译器无法检查
T::Output
上的条件,但不清楚具有相同条件的简单函数有什么区别

我使用的是Rust 1.35.0和Diesel 1.4。

我无法回答它们为什么不同。我可以说,重复特征定义的界限编译:

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);
    }
}
use diesel::query_dsl::methods:{LimitDsl,OffsetDsl};
特征分页器
哪里
Self:OffsetDsl,
Self::输出:LimitDsl,
{
fn为_页(自身);
}
T的植入分页器
哪里
T:OffsetDsl,
输出:LimitDsl,
{
第页(自我)的fn{
自偏移量(10)、限值(10);
}
}

您可能还对的感兴趣,它讨论了如何最好地添加一个
paginate
方法。

如果您使用
T::Output:LimitDsl
而不是
::Output:LimitDsl
,它是否有效?我尝试过,但似乎效果很好-diesel在操场上似乎不受支持,所以我没有尝试用真正的libr测试它ary Yet您使用的是哪种版本的rust?哪种渠道?以及哪种版本的diesel?否:(我想这可能与Diesel定义这些特性的方式有关,但我不知道如何定义。Rust编译器中的约束求解器有时可能有点脆弱——另请参见另一个示例。您可以尝试将实现限制为某些类型,而不是所有的
OffsetDsl
s?——这与您的
Paginator
但是在主体中定义了输出,并与输入类型相关。谢谢!我应该自己尝试一下。不过这有点奇怪,因为在这种情况下,我可以在trait定义中实现这个方法,而且我根本不需要实现。感谢链接!我已经阅读了它,但它看起来有点过于复杂了一个简单的任务,我希望它做。
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);
    }
}