Откуда берется переменная в плече совпадения в цикле? - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь реализовать HTTP-клиент в Rust, используя это как отправная точка .Я был послан по этой ссылке сайтом rust-lang.org через одно из предложенных на их странице предложений TcpStream.Я выясняю, как читать с TcpStream.Я пытаюсь следовать этому коду:

fn handle_client(mut stream: TcpStream) {
    // read 20 bytes at a time from stream echoing back to stream
    loop {
        let mut read = [0; 1028];
        match stream.read(&mut read) {
            Ok(n) => {
                if n == 0 { 
                    // connection was closed
                    break;
                }
                stream.write(&read[0..n]).unwrap();
            }
            Err(err) => {
                panic!(err);
            }
        }
    }
}

Откуда берется переменная n?Что именно это?Автор говорит, что читает 20 байтов за раз;откуда это происходит?

Я еще ничего не пробовал, потому что я хочу понять, прежде чем я это сделаю.

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Разобрался, вот что происходит:

match stream.read(&mut read) {

Эта строка говорит программному обеспечению о передаче stream.read(&mut read) в Ok(n), потому что stream.read возвращает числопрочитано байтов.Я все еще не уверен, почему они указывают 20 байтов за раз как читаемые.

0 голосов
/ 05 июня 2019

Я настоятельно рекомендую вам прочитать документацию по используемым вами инструментам. В этом случае match Оператор потока управления из Язык программирования Rust объясняет, что вам нужно знать.

Из паттернов, которые связываются со значениями раздел:

В выражении соответствия для этого кода мы добавляем переменную с именем state к шаблону, которая соответствует значениям варианта Coin::Quarter. При совпадении Coin::Quarter переменная state будет привязана к значению состояния этого квартала. Тогда мы можем использовать state в коде для этой руки, например:

fn value_in_cents(coin: Coin) -> u8 {
    match coin {
        Coin::Penny => 1,
        Coin::Nickel => 5,
        Coin::Dime => 10,
        Coin::Quarter(state) => {
            println!("State quarter from {:?}!", state);
            25
        },
    }
}

Если бы мы позвонили value_in_cents(Coin::Quarter(UsState::Alaska)), coin было бы Coin::Quarter(UsState::Alaska). Когда мы сравниваем это значение с каждым из совпадающих плеч, ни одно из них не совпадает, пока не достигнем Coin::Quarter(state) В этот момент привязка для состояния будет иметь значение UsState::Alaska. Затем мы можем использовать эту привязку в выражении println!, получая, таким образом, значение внутреннего состояния из варианта перечисления Coin для Quarter.

Существует целая глава о доступном синтаксисе сопоставления с образцом и о том, где его можно использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...