我有一个特征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]
。建议的方法是什么?
答案 0 :(得分:7)
可悲(或不),你必须重复这个界限。
去年我开了一个issue,认为类型检查器不一致。代码与您的代码类似。
@ arielb1关闭了这个问题并说这是预期的行为,并给出了这样的解释:
问题是我们不希望隐含太多的界限 可用于功能,因为这可能导致与远处的脆弱 更改导致函数停止编译。基本上有3个 函数可用的各种边界:
- 来自显式where子句的界限 - 例如
T: B
当你有这个条款时。这包括“半显式”Sized
绑定。- 来自显式where-clause的超类的边界 - where子句为其超级特征添加边界(如
trait B: A
,T: B
边界添加了T: A
已绑定)。- 来自参数的生命周期属性的界限(outlives / implicator /隐含边界)。这些只是一生的界限, 与当前问题无关。涉及rust-lang/rfcs#1214 他们很不错。
如果您的界限不在列表中,则必须明确添加它 你想用它。我想这应该是FAQ条目。
今天我打开了issue请求将此信息添加到文档中。