2014-10-16 13 views
5

Sto provando ad estrarre due elementi da un Vec, che conterrà sempre almeno due elementi. Questi due elementi devono essere estratti in modo flessibile in quanto devo essere in grado di modificare i valori su entrambi come parte di una singola operazione.Come estrarre due elementi mutabili da un Vec in ruggine

codice di esempio:

struct Piece { 
    x: u32, 
    y: u32, 
    name: &'static str 
} 

impl Piece { 
    fn exec(&self, target: &mut Piece) { 
    println!("{} -> {}", self.name, target.name) 
    } 
} 

struct Board { 
    pieces: Vec<Piece> 
} 

fn main() { 
    let mut board = Board { 
     pieces: vec![ 
     Piece{ x: 0, y: 0, name: "A" }, 
     Piece{ x: 1, y: 1, name: "B" } 
     ] 
    }; 

    let mut a = board.pieces.get_mut(0); 
    let mut b = board.pieces.get_mut(1); 
    a.exec(b); 
} 

Allo stato attuale, questo non riesce a costruire con i seguenti errori di compilazione:

piece.rs:26:17: 26:29 error: cannot borrow `board.pieces` as mutable more than once at a time 
piece.rs:26  let mut b = board.pieces.get_mut(1); 
          ^~~~~~~~~~~~ 
piece.rs:25:17: 25:29 note: previous borrow of `board.pieces` occurs here; the mutable borrow prevents subsequent moves, borrows, or modification of `board.pieces` until the borrow ends 
piece.rs:25  let mut a = board.pieces.get_mut(0); 
          ^~~~~~~~~~~~ 
piece.rs:28:2: 28:2 note: previous borrow ends here 
piece.rs:17 fn main() { 
... 
piece.rs:28 } 

Purtroppo, ho bisogno di essere in grado di ottenere un riferimento mutabile per entrambi in modo che Posso modificare entrambi all'interno del metodo Piece.exec. Qualche idea o sto cercando di farlo nel modo sbagliato?

risposta

8

Rust non può garantire in fase di compilazione che lo get_mut non riceva mutuamente lo stesso elemento due volte, quindi get_mut prende in prestito l'intero vettore in modo mutevole.

Al contrario, utilizzare slices

pieces.as_slice().split_at_mut(1) è ciò che si desidera utilizzare qui.

+0

Che bello, sembra aver fatto il trucco. Grazie mille. –

+1

@DavidEdmonds: 'mut_shift_ref' è anche utile (può essere utilizzato per eseguire il loop su tutte le coppie, ad esempio) – sellibitze

Problemi correlati