2015-07-25 6 views
6

Jestem nowy na rdzę i moich trudności z sprawdzający pożyczyć.Nie można ponownie pożyczyć zmienną bo nie mogę pożyczyć niezmienna zmiennej lokalnej jako zmienny

Wywołanie consume_byte z main działa dobrze. Ale jeśli spróbuję dodać inną funkcję (consume_two_bytes) pomiędzy to wszystko się rozpada.

Poniższy kod nie zostanie skompilowany, ponieważ wygląda na to, że zmienna reader nie jest zmienna i nie można jej wypożyczyć.

Dodanie &mut w sygnaturze funkcji powoduje jedynie zmianę błędu kompilatora.

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); 
} 

Odpowiedz

7

reader musi być zmienny w 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

Dziękujemy! Nigdy nie przyszło mi do głowy, żeby użyć 'mut' bez' i '. To była poważna wizja tunelu po mojej stronie. –

+0

@DonaldH Tak, "mut" znajdujący się w różnych miejscach jest nieco nieintuicyjny. – fjh

+0

To nieintuicyjne, dopóki się do tego nie przyzwyczaisz, to znów staje się intuicyjne^_ ^. Wiele osób wskazuje na to, że składnia jest lustrzana w stosunku do wiązań 'let'/wzorców. – Shepmaster

Powiązane problemy