作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个结构 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/
我是一名优秀的程序员,十分优秀!