递归实现特征 "Not"

Implement trait "Not" recursively

我有一个带有类型参数的 Rust 结构 Couple

我想在此 Couple<T> 上执行一个操作(在本例中为 Not): 如果T实现Not,这对对的否定就是对对的否定。

use std::ops::Not;

struct Couple<T>(T, T);

impl<T> Not for Couple<T>
where
    T: Not,
{
    type Output = Self;

    fn not(self) -> Self {
        Couple(T::not(self.0), T::not(self.1))
    }
}

此代码使用其他特征(例如 Default::default)编译,但不使用特征 Not.

我收到错误

error[E0308]: mismatched types
  --> src/lib.rs:12:16
   |
5  | impl<T> Not for Couple<T>
   |      - this type parameter
...
12 |         Couple(T::not(self.0), T::not(self.1))
   |                ^^^^^^^^^^^^^^ expected type parameter `T`, found associated type
   |
   = note: expected type parameter `T`
             found associated type `<T as Not>::Output`
help: consider further restricting this bound
   |
7  |     T: Not + Not<Output = T>,
   |            ^^^^^^^^^^^^^^^^^

为什么会这样?如何为 Couple 实现 Not 和其他操作特征?

实现 Not for T does not mean that it will necessarily return T. So you have to specify the Output 类型,例如Not<Output = T>.

use std::ops::Not;

struct Couple<T>(T, T);

impl<T> Not for Couple<T>
where
    T: Not<Output = T>,
{
    type Output = Self;

    fn not(self) -> Self {
        Couple(T::not(self.0), T::not(self.1))
    }
}

或者,如果您希望基于 <T as Not>::Output 允许不同的 Output 类型,那么您可以改为这样做:

impl<T> Not for Couple<T>
where
    T: Not,
{
    type Output = Couple<T::Output>;

    fn not(self) -> Self::Output {
        Couple(T::not(self.0), T::not(self.1))
    }
}

当然你也可以将Couple(T::not(self.0), T::not(self.1))简化为Couple(!self.0, !self.1).