Чтобы добавить элементы двух Vecs, я написал такую функцию, как
fn add_components(dest: &mut Vec<i32>, first: &Vec<i32>, second: &Vec<i32>){
for i in 0..first.len() {
dest[i] = first[i] + second[i];
}
}
И это прекрасно работает, когда dest
- это другой Vec.
let mut new_components = Vec::with_capacity(components.len());
Vector::add_components(&mut new_comps, &components, &other_components);
Но он взрывается, когда я пытаюсь добавить на месте:
Vector::add_components(&mut components, &components, &other_components);
потому что теперь я беру components
как изменчивый и неизменный одновременно. Но, очевидно, именно этого я и пытаюсь достичь.
Существуют ли какие-либо общепринятые и общие (не только в отношении Vecs) решения этой проблемы, которые не связаны с небезопасным кодом и магией указателей?
Другой пример этой проблемы:
Предположим, я хочу перегрузить AddAssign для числового типа, например
impl AddAssign<Output=&NumericType> for NumericType {
fn add_assign(&mut self, other: &NumericType) {
unimplemented!() // concrete implementation is not important
}
}
Обратите внимание, что я хочу использовать ссылку в качестве второго аргумента, чтобы избежать копирования. Это отлично работает при добавлении двух разных объектов, но добавление объекта к самому себе создает точно такой же сценарий:
let mut num = NumericType{};
num += &num
Я заимствую num
изменчиво и неизменно одновременно. Очевидно, что это должно работать и безопасно, но это также противоречит правилам заимствования Rust.
Каковы лучшие практики (помимо копирования, конечно) для решения этой проблемы, которая возникает во многих формах?
extend
просто не делает. Но это также не относится к моему вопросу: что я могу сделать, когда функция принимает один и тот же объект в качестве изменяемого и неизменяемого аргумента? И когда ответ таков, что нет канонического обходного пути или что он включает указатели, тогда все будет в порядке. - person Marvin H.   schedule 05.07.2020