如何确保泛型参数类型不同?

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

我定义了一个特征(让我们称之为

MyTrait
)并为任何类型的具有两个元素的元组实现它:

trait MyTrait {
  fn my_fn();
}

impl<T1, T2> MyTrait for (T1, T2) {
  fn my_fn() {...}
}

但是,我想确保仅当 T1 和 T2 是不同的具体类型时才实现该特征。例如。 (i32, i64) 可以,但 (i32, i32) 不行。这也应该可以扩展到更大的元组(最多 16 个元素)。有办法做到吗?

我尝试通过以下方式使用静态断言:

fn my_fn() {
   static OK: () = assert!(std::any::TypeId::of::<T1>() != std::any::TypeId::of::<T2>());
   ...
}

这会导致错误:

error[E0401]: can't use generic parameters from outer item

我想这是因为 OK 的值将被所有实现共享,无论 T1 和 T2 具体是什么?

我也尝试过思考如何通过特征界限来表达这一点(这似乎是一种更稳健的方法),但找不到方法。

generics rust
1个回答
0
投票

你为什么不简单地这样做呢?

use std::ops::Add;

#[derive(Debug, PartialEq)]
struct Point {
    x: i32,
    y: i64,
}

impl Add for Point {
    type Output = Point;

    fn add(self, other: Point) -> Point {
        Point {
            x: self.x + other.x,
            y: self.y + other.y,
        }
    }
}

fn main() {
    assert_eq!(
        Point { x: 1, y: 0 } + Point { x: 2, y: 3 },
        Point { x: 3, y: 3 }
    );
}

© www.soinside.com 2019 - 2024. All rights reserved.