我有一个继承自另一个trait Bar
的trait Foo
。 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 {
// ...
}
我不明白为什么需要这样做。我想要能够编写 [期望的代码]
。那么最佳的方法是什么?
trait Foo where ...
在概念上是否有效吗?我看到它可以编译,所以语法没问题,但它似乎有点奇怪。 - ShepmasterHoge
这样的元语法变量),我主要想知道当没有泛型类型时,你是否见过用于定义trait的where
子句;我不确定我是否见过。 - ShepmasterSelf
和所有关联类型本质上都是泛型类型参数,特别是Self
。虽然看起来确实很奇怪;如果这又是一种在语法上允许但对编译器没有语义意义的事情,我也不会感到惊讶(我在Rust问题跟踪器上确实看到过类似的东西)。 - Vladimir Matveevwhere T::Baz: Hoge
是必要的吗? - Tsukki