Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 需要在继承特征的关联类型上绑定特征_Rust - Fatal编程技术网

Rust 需要在继承特征的关联类型上绑定特征

Rust 需要在继承特征的关联类型上绑定特征,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) { // ... } 我不明白我为什么要这样

我有一个trait
Foo
继承自另一个trait
Bar
<代码>条形图具有关联的类型
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
    会添加一个
    T:A
    bound)
  • 参数的生存期属性的边界(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 {
    // ...
}