Types “实施特质”;不是";递归地

Types “实施特质”;不是";递归地,types,rust,operator-overloading,traits,Types,Rust,Operator Overloading,Traits,我有一个struct耦合和一个类型参数 我想在这对夫妇上实现一个操作(在本例中不是): 如果TimplementNot,则该对的否定就是否定的对 使用std::ops::Not; 结构耦合(T,T); 不适合夫妻 哪里 T:不是, { 类型输出=自身; fn非(自我)->自我{ 耦合(T::not(self.0),T::not(self.1)) } } 此代码使用其他特性(例如Default::Default)编译,但不使用traitnot 我得到了错误 错误[E0308]:类型不匹配 -->

我有一个struct
耦合
和一个类型参数

我想在这对
夫妇上实现一个操作(
在本例中不是
):
如果
T
implement
Not
,则该对的否定就是否定的对

使用std::ops::Not;
结构耦合(T,T);
不适合夫妻
哪里
T:不是,
{
类型输出=自身;
fn非(自我)->自我{
耦合(T::not(self.0),T::not(self.1))
}
}
此代码使用其他特性(例如Default::Default)编译,但不使用trait
not

我得到了错误

错误[E0308]:类型不匹配
-->src/lib.rs:12:16
|
5 |不适用于夫妇
|-此类型参数
...
12 |对(T::not(self.0),T::not(self.1))
|^^^^^^^^^^^^^^^^应为类型参数“T”,找到了关联的类型
|
=注意:应为类型参数`T`
找到关联的类型“::输出`
帮助:考虑进一步限制这个界限
|
7 | T:不+不,
|            ^^^^^^^^^^^^^^^^^
为什么会这样?如何实现
Not
Couple
的其他操作特性?

实现并不意味着它必然返回
T
。因此,您必须指定类型,例如执行
Not

使用std::ops::Not;
结构耦合(T,T);
不适合夫妻
哪里
T:不是,
{
类型输出=自身;
fn非(自我)->自我{
耦合(T::not(self.0),T::not(self.1))
}
}
或者,如果希望基于
::Output
允许不同的
输出类型,则可以改为:

impl不适用于夫妇
哪里
T:不是,
{
类型输出=耦合;
fn非(自)->自::输出{
耦合(T::not(self.0),T::not(self.1))
}
}

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

@rambi注意,这是一个真正的区别,特别是第二个版本为例如
Couple
实现了
而第一个版本没有。