为什么使用我的类型作为外部类型的参数来实现外部特征合法?

时间:2018-07-08 22:46:47

标签: rust traits orphan

我正在修改一些代码以依赖rand版本0.5。最初,我担心如何使用Standard生成自己类型的随机值,但我发现这是合法的:

impl ::rand::distributions::Distribution<MyType> for ::rand::distributions::Standard {
    // ...
}

为什么合法?我认为为外部类型实现外部特征是illegal

1 个答案:

答案 0 :(得分:4)

这些规则(称为 orphan规则 coherence规则)的全部目的是避免对于给定的特征/类型组合使用任何冲突的实现。从Rust 1.0开始,人们认为这与追求稳固性的语言“允许任何人为一个类型实现特征”“故意”相悖。

这种特定类型的实现的一个非常常见的示例是From

impl From<MyType> for i32 {
    // ...
}

通过使用局部类型对特征进行参数化,对于谁实现该特征仍然没有歧义。一种考虑方法是将Distribution视为特征而不是特征构造函数 1 Distribution的每个实例都会创建一个新特征,该特征是根据情况定制的。

另请参阅:

1 —这不是真的,但这是一个合理的比喻。