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

时间:2017-04-09 21:38:52

标签: methods types rust implementation

这是怎么回事......

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

......与此有何不同?

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

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

1 个答案:

答案 0 :(得分:2)

以下source指出了几个不同的论点,为什么一个人无法实现一个箱子之外的现有类型。

  • 未来的实施可以打破本地impl。例如,考虑“你已经在本地定义Add Vec<T>作为一个concat运算符,......,然后......经过多年的辩论......一些糟糕的操作[是]要执行。你删除你的impl和升级,你的代码将被破坏 2 。“

  • 代码的可读性也会受到这种变化的影响,也就是说,它可能使“阅读的价值更加短暂 3 。”

  • 还存在安全问题。考虑以下场景,如果允许这样做,技术上是可行的,即“攻击者[可以]找到[某些]库中的impl,他们希望后门的应用程序中的调用站点发送更改,并发送”重构“拉请求”意外“用旧impl替换新impl以创建漏洞,但他们的拉动可以引用库中的旧代码。并且他们可以将恶意impl嵌入到另一个创建的宏中< SUP> 4 。“

  • 假设如果允许本地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"));
        }
    }