Em Rust, há uma regra: um pedaço de memória pode ter muitos leitores ou um escritor de cada vez.
Quando você tem um único pedaço de memória (uma fatia ou um vetor) e deseja modificar diferentes partes dele por meio de várias fatias, o verificador de empréstimo reclama:
let whole = vec![1, 2, 3, 4, 5, 6];
let part1 = &mut whole[0..3];
let part2 = &mut whole[3..]; // Error!
Isso ocorre porque part1
já pegou o emprestado whole
, e Rust não se importa se os intervalos não se sobrepõem.
A solução para isso é split_at_mut
:
let (part1, part2) = whole.split_at_mut(3);
Isso dá a você 2 (ou mais, se você usar recursivamente) fatias e o compilador Rust tem a garantia de que os intervalos não se sobrepõem, então tudo está seguro.