一般情况下,假设C1、C2、C3不同,则不可能在 crate C1中实现C2中定义的特性,即 crate C3中定义的类型

但是有没有一个技巧可以有目的地设计一个特性,从而允许这样的实现呢?

推荐答案

不,没有这样的事情,因为它存在根本缺陷,因为它允许IMPL之间发生冲突.

例如,您可以升级依赖项的次要版本,那么您的代码将无法编译,因为在次要版本中,他们在某个具有impl-For特征的 crate 上添加了其依赖项,而您已经有了一个具有冲突impl的依赖项.

有一些方法可以放松连贯性,但都是不稳定的,没有一种方法与您想要的一致:

  • Negative impls允许您promise 某些特性永远不会用于某些类型,允许其他可能重叠的impl,但根本不会影响孤立判断;
  • Fundamental types允许您promise 某个类型不会添加一揽子impl,允许您为包装在其中的类型导入外来特征(这就是您可以在Box<LocalType>上导入外来特征的原因),但不允许在any类型上实现外来特征;
  • 基本特征是指为其添加全面实现是一个突破性的变化(尽管团队希望摆脱它们).这比负impl更普遍(甚至太普遍了,这就是为什么他们想去掉它),但就我所知,它只会影响重叠判断.

Rust相关问答推荐

在不可变迭代器上运行 next 时不能作为可变borrow (没有其他borrow )

如何使 Result 的内部值 must_use

返回对捕获的可变变量的引用

&str 和 &String 有什么区别

如何在遍历 Vector 时从 &String 复制字符串?

如果体系 struct 是32位还是64位,如何判断Rust?

需要澄清关于 `Box`、`Vec` 和其他集合的 (co)variance 的 Rust Nomicon 部分

在堆上分配 struct 还是让 struct 拥有堆指针更惯用?

不能在 Rc 中borrow 为可变的

为什么关联的常量不能依赖于类型参数?

带有 Rust 的可移植二进制文件

Rust 是否有等效于 C++ 的 decltype() 来获取表达式的类型?

我们应该使用Option或ptr::null来表示Rust中的空指针吗?

创建使用 try 运算符的闭包时,如何修复错误“type annotations needed”?

如何为不同类型的参数实现一个 struct 的 Fn 特征?

有没有办法防止 Weak::new() 过度分配?

使用 Emscripten 目标从 Rust 创建 Web Worker

允许 Rust 格式中未使用的命名参数format()

如何在 Rust 中禁用循环展开?

“Zero Cost Abstraction”是什么意思?