递归实现特征 "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)
.
我有一个带有类型参数的 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)
.