Есть структура:
#[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 нельзя использовать. Как это исправить?
Тут есть два варианта:
- Заменить вектор в структуре на массив и наследовать типаж
Copy
:
#[derive(Clone, Copy)]
pub struct VECTOR<T: Clone+Copy>
{
Zero: T,
Data: [T; 3],
}
- Сделать имплементацию типажа
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 лайк
Спасибо за ответ. Видимо придётся брать ссылки.