要求在相关类型的继承特征上绑定特征
我有一个特质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) {
// ...
}
除非我明确约束T
否则rustc
抱怨EO277
:
fn fizz<T: Foo>(buzz: T) where T::Baz: Hoge {
// ...
}
我不明白为什么我需要这样做。 我希望能写出[DESIRED CODE]
。 推荐的方法是什么?
可悲(或不),你必须重复界限。
去年我开了一个问题,认为类型检查器不一致。 该代码与您的代码类似。
@ arielb1关闭了这个问题,并说这是预期的行为,并给出了这样的解释:
问题是我们不希望太多的边界被隐式地用于函数,因为这会导致脆弱,导致函数停止编译的远程变化。 基本上有三种边界可用于一个功能:
T: B
。 这包括“半明确”的Sized
限制。 trait B: A
, T: B
界限添加T: A
界限)。 如果你的界限不在列表中,你将不得不明确地添加它,如果你想使用它。 我想这应该是一个FAQ条目。
今天我开了一个问题,要求将这些信息添加到文档中。
链接地址: http://www.djcxy.com/p/92107.html上一篇: Requiring a trait bound on the associated type of an inherited trait