我正在修改一些代码以依赖 rand 版本 0.5。起初,我担心如何使用 生成我自己类型的随机值Standard
,但我发现这是合法的:
impl ::rand::distributions::Distribution<MyType> for ::rand::distributions::Standard {
// ...
}
为什么是合法的?我认为为外部类型实现外部特征是非法的。
这些规则(称为孤儿规则或连贯规则)的全部目的是避免给定特征/类型组合的任何冲突实现。从 Rust 1.0 开始,人们认为对于谁被允许为一个类型实现一个 trait 是“不择手段”的,这将不符合一种追求稳固稳定性的语言。
这种特定类型的实现的一个非常常见的例子是From
:
impl From<MyType> for i32 {
// ...
}
通过使用本地类型参数化特征,对于谁在实现特征仍然没有歧义。一种思考方式是Distribution
不将其视为特征,而是将其视为特征构造函数 1。每个实例Distribution
都会创建一个新的特征,一个为案例定制的特征。
也可以看看:
1 — 这不是真的,但这是一个合理的类比。