这是怎么回事......
impl String {
fn foo(&self) {
//...
}
}
......与此有何不同?
fn foo(s: &String) {
//...
}
然后,如果在包中定义特征,则可以扩展类型实现。为什么呢?
答案 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"));
}
}