【发布时间】:2021-10-01 00:18:00
【问题描述】:
我有一个特征 Foo 继承自另一个特征 Bar。 Bar 具有关联类型 Baz。 Foo 约束 Baz 使得 Baz 必须实现 Hoge。
trait Hoge {}
trait Bar {
type Baz;
}
trait Foo: Bar where Self::Baz: Hoge {}
但是,当我定义一个需要泛型类型T 来实现Foo 的泛型函数时,
// [DESIRED CODE]
fn fizz<T: Foo>(buzz: T) {
// ...
}
rustc 抱怨 EO277 除非我明确限制 T:
fn fizz<T: Foo>(buzz: T) where T::Baz: Hoge {
// ...
}
我不明白为什么我需要这样做。我希望能够写[DESIRED CODE]。推荐的方法是什么?
【问题讨论】:
-
您知道
trait Foo where ...在概念上是否有效吗?我看到它编译,所以语法没问题,但它看起来……很奇怪。 -
您可以想象我需要一些关联类型的行为 (
Baz),这样当我在某些实现中使用Foo时,我可以使用该行为,类似于人们可能想要的要求继承特征的某些行为 (Bar)。 -
对不起,我不清楚。你的 intent 是可以理解的(因为它可以使用像
Hoge这样的元句法变量),我主要是问你是否见过where子句用于特征定义,而没有泛型类型;我不确定我有。 -
我不确定我是否曾经有过。是否有其他方法可以实现我的意图?
-
@Shepmaster,嗯,有有个泛型类型:
Self,所有关联的类型本质上都是泛型类型参数,尤其是Self。虽然它确实看起来很奇怪;如果这是另一种在语法上允许但对编译器没有语义意义的东西,我不会感到惊讶(我肯定在 Rust 问题跟踪器上看到过类似的东西)。
标签: rust