通用枚举实现 Rust

问题描述 投票:0回答:1

我想创建一个自定义容器,我选择了枚举而不是结构。我的目标是通过实现 Neg 和 Sub 特征使其具有数学功能。这是我尝试做的,但编译器需要对通用 T 进行进一步限制,我缺少什么以便代码可以编译?

use std::ops::{Neg, Sub};

#[derive(Debug)]
enum PolRec<T> {
  BTuple(T, T),
  Singly(T)
}

impl<T> Sub for PolRec<T> 
where
  T: Sub,
{
  type Output = PolRec<T>;
  fn sub(self, rhs: PolRec<T>) -> PolRec<T> {
    match (self, rhs) {
      (PolRec::BTuple(x, y), PolRec::BTuple(x2, y2)) => PolRec::BTuple(x-x2, y-y2),
      (PolRec::BTuple(x, y), PolRec::Singly(t)) => PolRec::BTuple(x-t, y-t),
      (PolRec::Singly(t), PolRec::BTuple(x, y)) => PolRec::BTuple(t-x, t-y),
      (PolRec::Singly(t), PolRec::Singly(t2)) => PolRec::Singly(t-t2),
    }
  }
}

impl<T> Neg for PolRec<T> 
where T: Neg,
{
  type Output = PolRec<T>;
  fn neg(self) -> PolRec<T> {
    match self {
      PolRec::BTuple(x, y) => PolRec::BTuple(-x, -y),
      PolRec::Singly(t) => PolRec::Singly(-t)
    }
  }
}

fn main() {
  let bt = PolRec::BTuple(6., 5.);
  println!("{:?}", -bt);
  println!("{:?}", bt-PolRec::Singly(6.));
}
rust
1个回答
0
投票

我发现这个工作正常,在

Sub<Output = T> + Copy
impl 块中添加特征边界
Sub
并在
Neg<Output = T>
impl 块中添加
Neg

use std::ops::{Neg, Sub};

#[derive(Debug, Clone)]
enum PolRec<T> {
    BTuple(T, T),
    Singly(T),
}

impl<T> Sub for PolRec<T>
where
    T: Sub<Output = T> + Copy,
{
    type Output = PolRec<T>;
    fn sub(self, rhs: PolRec<T>) -> PolRec<T> {
        match (self, rhs) {
            (PolRec::BTuple(x, y), PolRec::BTuple(x2, y2)) => PolRec::BTuple(x - x2, y - y2),
            (PolRec::BTuple(x, y), PolRec::Singly(t)) => PolRec::BTuple(x - t, y - t),
            (PolRec::Singly(t), PolRec::BTuple(x, y)) => PolRec::BTuple(t - x, t - y),
            (PolRec::Singly(t), PolRec::Singly(t2)) => PolRec::Singly(t - t2),
        }
    }
}

impl<T> Neg for PolRec<T>
where
    T: Neg<Output = T>,
{
    type Output = PolRec<T>;
    fn neg(self) -> PolRec<T> {
        match self {
            PolRec::BTuple(x, y) => PolRec::BTuple(-x, -y),
            PolRec::Singly(t) => PolRec::Singly(-t),
        }
    }
}

fn main() {
    let bt = PolRec::BTuple(6., 5.);
    let sl = PolRec::Singly(6.);
    println!("{:?}", -sl.clone());
    println!("{:?}", bt - sl);
}
© www.soinside.com 2019 - 2024. All rights reserved.