首页 文章

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

提问于
浏览
8

我有一个特征 Foo 继承自另一个特征 Bar . 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) {
    // ...
}

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

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

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

1 回答

  • 5

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

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

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

    问题是我们不希望有太多的界限可以隐式地用于函数,因为这可能导致脆弱而远程更改导致函数停止编译 . 一个函数基本上有3种可用的边界:来自显式where-clauses的边界 - 例如T:B,当你有那个条款 . 这包括“半显式”大小限制 . 来自显式where-clauses的超级特征的边界 - where子句为其超级特征添加边界(如特征B:A,T:B边界添加T:A边界) . 参数的生命周期属性的边界(outlives / implicator /隐含边界) . 这些只是生命界限,与当前问题无关 . rust-lang / rfcs#1214涉及他们很多 . 如果您的绑定不在列表中,则必须明确添加它才能使用它 . 我想这应该是FAQ条目 .

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

相关问题