要求在相关类型的继承特征上绑定特征

我有一个特质Foo继承了另一个特质BarBar有一个关联类型BazFoo约束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关闭了这个问题,并说这是预期的行为,并给出了这样的解释:

问题是我们不希望太多的边界被隐式地用于函数,因为这会导致脆弱,导致函数停止编译的远程变化。 基本上有三种边界可用于一个功能:

  • 从明确的where子句开始,例如T: B 。 这包括“半明确”的Sized限制。
  • 从显式where子句的超级范围界限 - where子句为其超级图片添加界限(如trait B: AT: B界限添加T: A界限)。
  • 范围从参数的生命周期属性(outlives / implicator / implied bounds)。 这些只是一生的界限,与目前的问题无关。 rust-lang / rfcs#1214涉及他们很多。
  • 如果你的界限不在列表中,你将不得不明确地添加它,如果你想使用它。 我想这应该是一个FAQ条目。

    今天我开了一个问题,要求将这些信息添加到文档中。

    链接地址: http://www.djcxy.com/p/92107.html

    上一篇: Requiring a trait bound on the associated type of an inherited trait

    下一篇: Large CMake Project loading is slow in CLion