2015-07-25 10 views
6

Sono nuovo a Rust e ho difficoltà con il controllore del prestito.Impossibile prendere in prestito una variabile perché non posso prendere in prestito una variabile locale immutabile come mutabile

Chiamare consume_byte da main funziona correttamente. Ma se provo ad aggiungere un'altra funzione (consume_two_bytes) tra una cosa e l'altra cade a pezzi.

Il seguente codice non verrà compilato poiché sembra che la variabile reader in consume_two_bytes non sia mutabile e non possa essere presa in prestito.

L'aggiunta di una &mut nella firma della funzione modifica l'errore del compilatore.

use std::io::Read; 
use std::net::TcpListener; 

fn consume_byte<R>(reader: R) where R: Read { 
    let mut buffer = vec![]; 
    reader.take(1).read_to_end(&mut buffer).unwrap(); 
} 

fn consume_two_bytes<R>(reader: R) where R: Read { 
    consume_byte(&mut reader); 
    consume_byte(&mut reader); 
} 

fn main() { 
    let listener = TcpListener::bind("127.0.0.1:8080").unwrap(); 
    let (mut stream, _) = listener.accept().unwrap(); 

    consume_byte(&mut stream); 
    consume_byte(&mut stream); 

    consume_two_bytes(&mut stream); 
} 

risposta

7

reader deve essere mutabile in consume_two_bytes:

fn consume_two_bytes<R>(mut reader: R) where R: Read { // note the mut 
    consume_byte(&mut reader); 
    consume_byte(&mut reader); 
} 
+0

Grazie! Non mi è mai venuto in mente di usare 'mut' senza' & '. Questa è stata una visione seria del tunnel sulla mia estremità. –

+0

@DonaldH Sì, il 'mut' in luoghi diversi è un po 'non intuitivo. – fjh

+0

Non è intuitivo finché non ci si abitua, quindi diventa di nuovo intuitivo^_ ^. Molte persone sottolineano che la sintassi rispecchia quella dei legami 'let'/associazioni di modelli. – Shepmaster