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

M F*_*yck 4 traits orphan rust

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

impl ::rand::distributions::Distribution<MyType> for ::rand::distributions::Standard {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

She*_*ter 5

这些规则(称为孤儿规则一致性规则)的全部目的是避免给定特征/类型组合的任何冲突实现。从 Rust 1.0 开始,人们认为,对于允许谁为类型实现 trait 的“随意”,这不符合一种力求稳固稳定性的语言。

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

impl From<MyType> for i32 {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

通过使用本地类型参数化特征,对于谁在实现特征仍然没有歧义。考虑它的一种方法是将其Distribution视为不是特征而是特征构造函数 1。的每个实例Distribution都会创建一个新特征,这是为案例定制的。

也可以看看:

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