Rust 需要在继承特征的关联类型上绑定特征
我有一个traitRust 需要在继承特征的关联类型上绑定特征,rust,Rust,我有一个traitFoo继承自另一个traitBar条形图具有关联的类型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) { // ... } 我不明白我为什么要这样
Foo
继承自另一个traitBar
<代码>条形图具有关联的类型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) {
// ...
}
我不明白我为什么要这样做。我希望能够编写[所需代码]
。推荐的方法是什么?遗憾的是(或不是),您必须重复边界
去年,我打开了一个窗口,认为类型检查器不一致。代码与您的类似
@arielb1结束了该问题,并表示这是预期行为,并给出了以下解释:
问题是,我们不希望隐式定义太多的边界
可用于功能,因为这可能导致与远程连接的脆弱性
导致函数停止编译的更改。基本上有三种
函数可用的边界类型:
- 显式where子句的边界-例如,当您有该子句时,
。这包括“半显式”T:B
绑定Sized
- 显式where子句的supertraits的边界-where子句为其supertraits添加边界(如
,绑定的trait B:a
会添加一个T:B
bound)T:A
- 参数的生存期属性的边界(outlives/Implicater/Implicated bounds)。这些只是生命的界限, 与当前问题无关。卷入的 他们有很多
今天我打开了一个请求,请求将此信息添加到文档中。您知道
trait Foo where…
在概念上是否有效吗?我看到它是编译的,所以语法还可以,但是看起来。。。奇怪。你可以想象,我需要一些关联类型的行为(Baz
),这样当我在一些实现中使用Foo
时,我就可以使用这种行为,类似于人们可能需要一些继承特征(Bar
)的行为。对不起,我不清楚。你的意图是可以理解的(就像元语法变量一样,比如Hoge
),我主要是问你是否见过where
子句,用于在没有泛型类型的情况下定义特征;我不确定我有没有。我不确定我是否有过。有没有其他方法可以达到我的目的?@Shepmaster,有一些泛型类型:Self
,所有关联的类型本质上都是泛型类型参数,尤其是Self
。虽然看起来确实很奇怪;如果这是另一种语法上允许但对编译器没有语义意义的东西,我不会感到惊讶(我在Rust issue tracker上肯定看到过类似的东西)。我强烈反对将一些合理预期的行为排除在外的想法,因为这可能会使生锈变得更难。我们应该弄清楚用户想要输入什么,并尽最大努力匹配它。
fn fizz<T: Foo>(buzz: T) where T::Baz: Hoge {
// ...
}