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