要求在相关类型的遗传特征上绑定特征

时间:2016-06-02 19:37:55

标签: rust

我有一个特征Foo继承自另一个特质BarBar具有关联的类型BazFoo约束BazBaz必须实施Hoge

trait Hoge {}

trait Bar {
    type Baz;
}

trait Foo: Bar where Self::Baz: Hoge {}

但是,当我定义一个通用函数需要通用类型T来实现Foo时,

// [DESIRED CODE]
fn fizz<T: Foo>(buzz: T) {
    // ...
}

rustcEO277投诉,除非我明确约束T

fn fizz<T: Foo>(buzz: T) where T::Baz: Hoge {
    // ...
}

我不明白为什么我需要这样做。我希望能够写[DESIRED CODE]。建议的方法是什么?

1 个答案:

答案 0 :(得分:7)

可悲(或不),你必须重复这个界限。

去年我开了一个issue,认为类型检查器不一致。代码与您的代码类似。

@ arielb1关闭了这个问题并说这是预期的行为,并给出了这样的解释:

  

问题是我们不希望隐含太多的界限   可用于功能,因为这可能导致与远处的脆弱   更改导致函数停止编译。基本上有3个   函数可用的各种边界:

     
      
  • 来自显式where子句的界限 - 例如T: B当你有这个条款时。这包括“半显式”Sized绑定。
  •   
  • 来自显式where-clause的超类的边界 - where子句为其超级特征添加边界(如trait B: AT: B边界添加了   T: A已绑定)。
  •   
  • 来自参数的生命周期属性的界限(outlives / implicator /隐含边界)。这些只是一生的界限,   与当前问题无关。涉及rust-lang/rfcs#1214   他们很不错。
  •   
     

如果您的界限不在列表中,则必须明确添加它   你想用它。我想这应该是FAQ条目。

今天我打开了issue请求将此信息添加到文档中。