4

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

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

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

4

1 回答 1

6

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

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

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

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

也可以看看:

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

于 2018-07-09T02:02:12.487 回答