繁体   English   中英

如何在不使用 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 所以现在我想在不使用std::ops::Add trait 的情况下为每个实现MyTrait的结构实现 '+' 运算符。

这在设计上是不可能的。

原因是 Rust 具有禁止板条箱(您)为类型实现特征的孤儿规则,除非其中至少一个(特征或类型)由该板条箱(您)定义。

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

所以现在我想在不使用std::ops::Add trait 的情况下为每个实现MyTrait的结构实现 '+' 运算符。

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

答案是你不能。

所以你可以:

  • 使用声明性宏来实现您trait 和Add
  • 不使用+运算符

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM