为什么Rust会阻止外部结构实现外部特性?

为什么Rust会阻止外部结构实现外部特性?,rust,traits,Rust,Traits,我刚刚遇到了一个问题,那就是为我不拥有的类型实现一个我不拥有的特性。然后我用谷歌搜索了确切的问题 让我困惑的是这种限制背后的动机。我来自Scala,在那里可以为外部类型创建一个外部typeclass实例 为什么Rust会限制这一点?我刚刚读了《There》中关于实现特性的一章,正如@AlexLarionov在评论中指出的那样,选择合适的实现是不可能的: 但是我们不能在外部类型上实现外部特征。例如 我们无法在聚合器中实现Vec上的显示特性 板条箱,因为标准库中定义了Display和Vec 而且不是

我刚刚遇到了一个问题,那就是为我不拥有的类型实现一个我不拥有的特性。然后我用谷歌搜索了确切的问题

让我困惑的是这种限制背后的动机。我来自Scala,在那里可以为外部类型创建一个外部typeclass实例

为什么Rust会限制这一点?

我刚刚读了《There》中关于实现特性的一章,正如@AlexLarionov在评论中指出的那样,选择合适的实现是不可能的:

但是我们不能在外部类型上实现外部特征。例如 我们无法在聚合器中实现
Vec
上的
显示
特性 板条箱,因为标准库中定义了
Display
Vec
而且不是我们聚合器板条箱的本地产品。这项限制是法律的一部分 程序的一种属性称为连贯性,更具体地说是 孤立规则,因父类型不存在而命名。这 该规则确保其他人的代码不会破坏您的代码,反之亦然 反之亦然。如果没有这条规则,两个板条箱可以实现相同的特性 相同的类型,Rust不知道使用哪个实现


基于观点,但假设板条箱A和板条箱B都实现了类型
D::Bar
的trait
C::foo
,选择哪一种?@AlexLarionov有意义。另请参阅;就我所记得的,一些参与锈设计的人从Haskell那里得到了非常糟糕的体验。在Haskell中,您可以为现有类型定义现有的TypeClass,有些包会这样做,这会导致难以理解的bug和错误。