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

Tsu*_*kki 10 rust

我有一个Foo从另一个特征继承的特征Bar.Bar有一个相关的类型Baz.Foo限制Baz使得Baz必须实现Hoge.

trait Hoge {}

trait Bar {
    type Baz;
}

trait Foo: Bar where Self::Baz: Hoge {}
Run Code Online (Sandbox Code Playgroud)

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

// [DESIRED CODE]
fn fizz<T: Foo>(buzz: T) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

rustc抱怨,EO277除非我T明确约束:

fn fizz<T: Foo>(buzz: T) where T::Baz: Hoge {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

mal*_*rbo 7

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

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

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

问题是我们不希望有太多的界限可以隐式地用于函数,因为这可能导致脆弱而远程更改导致函数停止编译.函数基本上有3种可用的边界:

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

如果您的绑定不在列表中,则必须明确添加它才能使用它.我想这应该是FAQ条目.

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

  • 我懂了。我强烈不同意这种排除一些合理预期行为的想法,因为这可能会使 Rust 的开发变得更加困难。我们应该弄清楚用户想要输入什么,并尽力匹配它。 (3认同)