簡體   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