gpt4 book ai didi

types - 递归实现特征 "Not"

转载 作者:行者123 更新时间:2023-12-03 11:27:19 25 4
gpt4 key购买 nike

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

我想在这个 Not 上执行一个操作(在本例中为 Couple<T>) :如果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>,
| ^^^^^^^^^^^^^^^^^

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

最佳答案

实现 Not for T 并不意味着它一定会返回 T .所以你必须指定 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))
}
}

或者,如果您想允许不同的 Output类型,基于 <T as Not>::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) .

关于types - 递归实现特征 "Not",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65355535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com