Generi c реализация для std :: ops на кортежах - PullRequest
0 голосов
/ 08 февраля 2020

Я хочу Add и Sub в кортеже. Простая реализация, похоже, не работает.

impl Add for (u32, u32) {
    type Output = (u32, u32);
    fn add(self, other: Self) -> Self::Output {
        (self.0 + other.0, self.1 + other.1)
    }
}

Было бы много шаблонов сделать это для каждого примитива. Как я могу сделать это с обобщениями и написать одну реализацию для каждого примитива (или другого объекта), который уже реализует std::ops::Add

1 Ответ

1 голос
/ 08 февраля 2020

Rust не позволяет вам создавать свои собственные операторы или перегружать произвольные операторы. Но вы можете перегрузить операции и соответствующие признаки, перечисленные в std :: ops, реализовав свойства, связанные с оператором.

Для произвольных типов могут быть реализованы только черты, определенные в текущем ящике .

Поэтому мое решение заключается в использовании структуры кортежей struct My2<T>(T, T);:

use std::ops::Add;

#[derive(Debug, PartialEq)]
struct My2<T>(T, T);

impl<T: Add<Output = T>> Add for My2<T> {
    type Output = Self;

    fn add(self, other: Self) -> Self::Output {
        Self(self.0 + other.0, self.1 + other.1)
    }
}

fn main() {
    assert_eq!(My2(1, 0) + My2(2, 3), My2(3, 3));
}
...