所以我有几个 struct ,我已经在上面实现了Add和Neg特征. 我现在想在它们上实施子特征 我想要的是能够沿着这些线写一些东西

impl<T: Add + Neg> Sub for T{
type Output = self
   fn sub(self, rhs:Self) -> Self{
       self + (-rhs)
   }
}

但这给了我一个错误: 仅当为其实现外来特征的类型中至少有一个是本地类型时,才能实现该特征 对于类型参数,只能实现当前框中定义的特征

上一次我遇到这个问题时,我复制粘贴了每个相关类型的Impl块.不是很耗时,但很难看. 只找到了2015年的this stackoverflow question个,显然唯一的方法是使用宏,但在我的情况下,情况会更糟.我在想,现在有没有别的办法

推荐答案

不,你不能.

Rust使用孤儿规则来确保特征实现的一致性.

一致性意味着某个类型应该只实现零次或一次特征(当某个类型多次实现特征时,这称为‘重叠’),这在单个编译过程中可以很容易地进行判断.但实际上,当类型、特征和实现跨 crate 定义时,实现仍然可能重叠.

当任何新的框被引入到编译中时,框系统的设计断言它必须是纯粹的附加的(这意味着它不能 destruct 任何现有代码).换句话说,只要每个依赖项可以单独编译而没有问题,就应该确保A Crate及其所有依赖项可以毫无问题地进行编译.一个非常明显例子是,当箱ab都是为某一特性提供其特定类型的实现的无关箱时,它们可以单独成功地编译,但是如果另一特性c依赖于ab两者,则如箱c可以看到的那样,该特性的这种类型的实现是重叠的.

孤儿规则可以简单地解释为,对于特定的类型和特定的trait ,只有类型的定义者或trait 的定义者才能定义该类型的trait 的实现.换句话说,一旦定义了类型和特征,类型是否以及如何实现特征就完全决定了,不能再由下游 crate 添加或重叠.因此,对于任何既可以看到类型又可以看到特征的箱子,它们必须为类型看到相同的零个或一个特征实现.

请注意,泛型参数也可以引用外来类型(不是由当前机箱定义的类型),因此不能为泛型参数实现外来特征

Rust相关问答推荐

为什么拥有的trait对象的相等运算符移动了正确的操作数?

为什么要在WASM库中查看Rust函数需要`#[no_mangle]`?

在特征中使用Async时,如何解决不透明类型`impl Future<;out=self>;`不满足其关联的类型边界和警告?

为什么允许我们将可变引用转换为不可变引用?

你是如何在铁 rust 一侧的金牛座获得应用程序版本的?

如何正确重新排列代码以绕过铁 rust 借入判断器?

为什么Rust不支持带关联常量的特征对象?

如何在Rust中基于字符串 Select struct ?

什么时候使用FuturesOrdered?

为什么不';t(&;mut-iter).take(n)取得iter的所有权?

为什么 vec![Vec::with_capacity(n)] 为子向量创建 0 容量?

为什么 `Deref` 没有在 `Cell` 上实现?

tokio::spawn 有和没有异步块

SDL2 没有在终端键上触发?

返回引用字符串的future

如何在 Rust 中返回通用 struct

相交着色器从 SSBO 中读取零

TinyVec 如何与 Vec 大小相同?

在 Rust 中组合特征的不同方法是否等效?

守卫如何影响匹配语句?