Сложение векторов

Есть структура:

#[derive(Clone)]
pub struct VECTOR<T: Clone>
{
Zero: T,
Data: Vec,
}
Пытаюсь реализовать операцию сложения:

impl<T: Add<Output=T> + Clone + AddAssign> Add for VECTOR
{
type Output = VECTOR;
fn add(self, other: VECTOR) -> VECTOR
{
let Len = max(self.Data.len(), other.Data.len());
let mut Res = self.clone();

    for i in 0..Len
    {
        Res[i] += other[i].clone();
    }

    Res
}

}

Рассмотрим такой код:

//qwe - VECTOR
//asd - VECTOR
let zxc = qwe + asd

после него ни qwe, ни asd нельзя использовать. Как это исправить?

Тут есть два варианта:

  1. Заменить вектор в структуре на массив и наследовать типаж Copy:
    #[derive(Clone, Copy)]
    pub struct VECTOR<T: Clone+Copy>
    {
        Zero: T,
        Data: [T; 3],
    }
  1. Сделать имплементацию типажа Add для ссылки на VECTOR<T>:
    impl<'v, 'u, T> Add<&'v VECTOR<T>> for &'u VECTOR<T> where T: .... {
        type Output = VECTOR<T>;
    ....
    }

и при сложении брать ссылки:

    let zxc = &qwe + &asd;

P.S. Пример, который вы привели, содержит кучу синтаксических ошибок. Советую давать ссылку на https://play.rust-lang.org/ с кодом который воспроизводит вашу проблему.

Как создать минимальный, самодостаточный и воспроизводимый пример

Для выделения участков c исходным кодом используйте тройной апостроф ``` с новой строки.

1 лайк

Спасибо за ответ. Видимо придётся брать ссылки.