[英]Why do I get a Rust compilation error when combining higher-rank trait bounds with associated types?
我正在编写一些涉及泛型特征和非'static
类型'static
Rust 代码,因此我遇到了近似泛型关联类型的需要。 我知道在当前的 Rust 中无法优雅地模拟 GAT,但我认为我已经找到了一种(不优雅的)解决方法,它适用于我的特定情况,使用具有生命周期参数和更高等级特征边界的特征。 但是,关于缺少关联类型的特征实现,我遇到了我不明白的编译器错误。
以下代码显示了重现错误的最小示例。
use std::fmt::Debug;
trait Resource<'r> {
type Value;
}
struct ResourceImpl();
impl<'r> Resource<'r> for ResourceImpl {
type Value = u32;
}
fn test_generic<R>()
where
for<'r> R: Resource<'r>,
for<'r> <R as Resource<'r>>::Value: Debug,
{
}
fn test_specific() {
test_generic::<ResourceImpl>();
}
当我尝试编译此代码 ( rustc
1.41.0) 时,收到以下错误消息。
error[E0277]: `<ResourceImpl as Resource<'r>>::Value` doesn't implement `std::fmt::Debug`
--> src/lib.rs:21:5
|
13 | fn test_generic<R>()
| ------------
...
16 | for<'r> <R as Resource<'r>>::Value: Debug,
| ----- required by this bound in `test_generic`
...
21 | test_generic::<ResourceImpl>();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `<ResourceImpl as Resource<'r>>::Value` cannot be formatted using `{:?}` because it doesn't implement `std::fmt::Debug`
|
= help: the trait `for<'r> std::fmt::Debug` is not implemented for `<ResourceImpl as Resource<'r>>::Value`
错误消息听起来像是在说u32
没有实现Debug
,这是没有意义的。 我一定误解了错误消息的含义,但我无法弄清楚实际问题是什么。
有一个关于这个问题的公开问题。
在您的情况下,解决方法可能是将Debug
绑定到关联类型Resource::Value
?
trait Resource<'r> {
type Value: Debug;
}.
正如 attdona 指出的那样,这似乎是一个编译器错误(这里有一个未解决的问题)。 关于这个问题的讨论指向了这个 Stack Overflow 问题,它提供了一个对我有用的解决方法。 解决方法的关键点是在高阶 trait bound 中提到的 trait 必须具有与for<_>
生命周期参数匹配的生命周期参数。 这可以通过使用所需的生命周期参数创建包装特征(在这种情况下围绕Debug
)来实现。
在问题中给出的最小示例的情况下,解决方法如下所示:
use std::fmt::Debug;
trait Resource<'r> {
type Value;
}
struct ResourceImpl();
impl<'r> Resource<'r> for ResourceImpl {
type Value = u32;
}
trait DebugWithLifetime<'r>: Debug {}
impl<'r, T> DebugWithLifetime<'r> for T where T: Debug {}
fn test_generic<R>()
where
for<'r> R: Resource<'r>,
for<'r> <R as Resource<'r>>::Value: DebugWithLifetime<'r>,
{
}
fn test_specific() {
test_generic::<ResourceImpl>();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.