方法 – 为什么Rust禁止实现现有类型?

这怎么样…

impl String {
    fn foo(&self) {
        //...
    }
}

……这有什么不同吗?

fn foo(s: &String) {
    //...
}

然后,如果在包中定义特征,则可以扩展类型实现.为什么?

最佳答案 关于为什么一个人无法实现一个箱子之外的现有类型,下面的 source指出了几个不同的论点.

>未来的实施可以打破本地impl.例如,考虑“你已经在本地定义了添加Vec< T>作为一个concat运算符,……,然后……经过多年的辩论……一些糟糕的操作[是]要执行.如果你删除你的impl并升级,你的代码将是…… broken2.“
>代码的可读性也会受到这种变化的影响,也就是说,它可能使“读取的值更加短暂3”.
>还有一个安全问题.考虑以下场景,如果允许这样做,技术上是可行的,即“攻击者[可以]找到[某些]库中的impl,他们希望后门的应用程序中的调用站点发送更改,并发送”重构“拉请求”意外“用旧impl替换新impl以创建漏洞,但他们的拉动可以引用库中的旧代码.并且他们可以将恶意impl嵌入到另一个create4中的宏中. “
>假设如果允许本地impl,则本地impl将是首选实现.这将“违反一致性财产[目前正在维持] 5.”这一点可以通过所谓的“HashTable”问题5进一步澄清.

mod foo {
    impl Hash for i32 { ... }

    fn f(mut table: HashMap<i32, &'static str>) {
        table.insert(0, "hello");
        ::bar::f(&table);
    }
}

mod bar {
    impl Hash for i32 { ... }

    fn f(table: &HashMap<i32, &'static str>) {
        assert_eq!(table.get(0), Some("hello"));
    }
}
点赞