如何在不使用 ops::Add 特征的情况下重载运算符?

How to overloading operator without using ops::Add trait?

我有一些这样的代码:

trait MyTrait{}

struct MyStruct{}
impl MyTrait for MyStruct{}

我想为每个实现 MyTrait 的结构实现“+”运算符,所以我尝试了这个

impl<T: MyTrait> std::ops::Add for T
{
...
} 

但我收到错误消息:type parameter `T` must be used as the type parameter for some local type。所以现在我想为每个实现 MyTrait 的结构实现 '+' 运算符而不使用 std::ops::Add 特征。

这是设计不可能的。

原因是 Rust 具有 orphan rules 禁止板条箱(您)实现类型的特征,除非至少其中之一(特征或类型)由该板条箱定义(您).

您正在尝试为所有类型 T 实现 std::op::Add(在另一个板条箱 std 中定义的特征),其中一些不一定由您定义(因为任何crate 可以定义新的类型)。因此,您违反了孤儿规则。

So now i want to implement '+' operator for every struct that implements MyTrait without using std::ops::Add trait.

特征是运算符重载在 Rust 中的实现方式(以及大多数其他“生命周期”/“编译器”挂钩)。所以你基本上是在问如何在不实现 + 运算符的情况下实现 + 运算符。

答案是你不能。

因此您可以:

  • 使用声明性宏实现你的特质和Add
  • 不使用 + 运算符