为什么在将较高的秩特征边界与关联类型组合时会出现Rust编译错误?

为什么在将较高的秩特征边界与关联类型组合时会出现Rust编译错误?,rust,Rust,我正在编写一些涉及泛型特征和非静态类型的锈代码,因此我遇到了近似的需求。我知道GATs不能在当前的Rust中被优雅地模仿,但我想我已经找到了一个(不优雅的)解决方法,它适用于我的特定情况,使用具有生命参数和更高等级特征界限的特征。然而,我得到了我不理解的编译器错误,关于缺少关联类型的trait实现 下面的代码显示了一个复制错误的最小示例 使用std::fmt::Debug; trait资源R:Resource>::Value`未实现`std::fmt::Debug` -->src/lib.rs:

我正在编写一些涉及泛型特征和非静态类型的锈代码,因此我遇到了近似的需求。我知道GATs不能在当前的Rust中被优雅地模仿,但我想我已经找到了一个(不优雅的)解决方法,它适用于我的特定情况,使用具有生命参数和更高等级特征界限的特征。然而,我得到了我不理解的编译器错误,关于缺少关联类型的trait实现

下面的代码显示了一个复制错误的最小示例

使用std::fmt::Debug;
trait资源R:Resource>::Value`未实现`std::fmt::Debug`
-->src/lib.rs:21:5
|
13 | fn测试|通用()
|    ------------
...
16 |对于>::值:调试,
|----此绑定在“测试”中需要`
...
21 |测试|通用::();
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^>::值`
错误消息听起来像是在说
u32
没有实现
Debug
,这是没有意义的。我一定是误解了错误消息的意思,但我不知道实际的问题是什么。

关于这个问题有一个解决方案

在您的情况下,一种解决方法是将
Debug
绑定到关联的类型
Resource::Value

trait Resource<'r> {
    type Value: Debug;
}.

trait-Resource正如阿特多纳所指出的,这似乎是一个编译器错误(还有一个未决问题)。关于这个问题的讨论指出了一个问题,这为我提供了一个解决办法。解决方法的关键点是,在较高等级的trait界限内提到的trait必须具有与
内的那些参数匹配的生存期参数。这可以通过使用所需的生存期参数创建一个包装特性(在本例中是围绕
Debug
)来实现

对于问题中给出的最小示例,解决方法如下所示:

使用std::fmt::Debug;
特征资源:调试{}
T的impl,其中T:Debug{}
fn测试_通用()
哪里
对于

对于>::Value:debugWithLifeTime关于这个问题有一个答案。@attdona我想这是一个答案–编译器和语言团队的人说它应该编译,这是最权威的。