Wie werden 2 veränderbare Scheiben eines Rust-Arrays bearbeitet?

Ich habe eine Funktion, die zwei Teile eines einzelnen Arrays bearbeiten muss. Der Zweck ist, in der Lage zu sein, ein @ zu bau#[nostd] Allokator, der dem Aufrufer einen variablen Teil eines größeren Arrays zurückgeben und den Rest des Arrays für zukünftige Allokationen beibehalten kann.

Hier ist ein Beispielcode, der fehlschlägt:

fn split<'a>(mut item: &'a mut [i32], place: usize) -> (&'a mut [i32], &'a mut [i32]) {
    (&mut item[0..place], &mut item[place..])
}

fn main() {
    let mut mem: [i32; 2048] = [1; 2048];
    let (mut array0, mut array1) = split(&mut mem[..], 768);
    array0[0] = 4;
    println!("{:?} {:?}", array0[0], array1[0]);
}

der Fehler ist wie folgt:

error[E0499]: cannot borrow `*item` as mutable more than once at a time
 --> src/main.rs:2:32
  |
2 |     (&mut item[0..place], &mut item[place..])
  |           ----                 ^^^^ second mutable borrow occurs here
  |           |
  |           first mutable borrow occurs here
3 | }
  | - first borrow ends here

Dieses Muster kann auch hilfreich sein für QuickSort an Ort und Stelle usw.

Ist es unsicher, wenn zwei veränderbare Verweise auf nicht überlappende Slices desselben Arrays vorhanden sind? Wenn es in reinem Rust keinen Weg gibt, gibt es ein "sicheres"unsafe Beschwörung, die es erlaubt, fortzufahren?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage