【问题标题】:Why is implementing an external trait using my type as a parameter for an external type legal?为什么使用我的类型作为外部类型的参数来实现外部特征是合法的?
【发布时间】:2018-12-16 14:31:56
【问题描述】:

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

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

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

【问题讨论】:

  • 我认为规则只是为本书简化了。如果编译器能够确保不存在任何冲突的实现,则编译器可以允许更多情况,例如这种情况。

标签: rust traits orphan


【解决方案1】:

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

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

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

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

另见:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2017-11-21
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多