我正在修改一些代码以依赖rand版本0.5。最初,我担心如何使用Standard
生成自己类型的随机值,但我发现这是合法的:
impl ::rand::distributions::Distribution<MyType> for ::rand::distributions::Standard {
// ...
}
为什么合法?我认为为外部类型实现外部特征是illegal。
答案 0 :(得分:4)
这些规则(称为 orphan规则或 coherence规则)的全部目的是避免对于给定的特征/类型组合使用任何冲突的实现。从Rust 1.0开始,人们认为这与追求稳固性的语言“允许任何人为一个类型实现特征”“故意”相悖。
这种特定类型的实现的一个非常常见的示例是From
:
impl From<MyType> for i32 {
// ...
}
通过使用局部类型对特征进行参数化,对于谁实现该特征仍然没有歧义。一种考虑方法是将Distribution
视为特征而不是特征构造函数 1 。 Distribution
的每个实例都会创建一个新特征,该特征是根据情况定制的。
另请参阅:
1 —这不是真的,但这是一个合理的比喻。