Отправка Rust TcpStream из TcpListener в отдельный метод в цикле

#rust #traits #tcplistener

#Ржавчина #Трейты #tcplistener

Вопрос:

Я новичок в Rust и имею следующий код:

 while let Some(tcp_stream) = incoming.next() {
    match tcp_stream {
        Ok(s) => {
            handle_request(tcp_stream.unwrap(), amp;routes);
        }
        Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
            continue;
        }
        Err(e) => panic!("Error"),
    };
}
  

И я получаю следующую ошибку:

 use of moved value: `tcp_stream`

value used here after partial move

note: move occurs because value has type `std::net::TcpStream`, which does not implement the `Copy` trait rustc(E0382)
lib.rs(72, 20): value moved here
lib.rs(73, 36): value used here after partial move
  

Что я хочу сделать, так это обработать новое соединение / TcpStream отдельным методом handle_request , но я не уверен, как это сделать. Передача ссылки приводит к той же проблеме. Я попытался реализовать Copy признак для TcpStream , но, поскольку я нахожусь за пределами его ящика, я, похоже, не могу этого сделать.

Любые указатели будут с благодарностью!

Комментарии:

1. Хейя, ты читала главу об обработке ошибок ? Я не уверен, сколько вам нужно объяснить в ответе… Просто match операторы используют значения, которые вы сопоставляете, и вы хотите использовать s: TcpStream извлеченные из Result .

2. Пробовал использовать tcp_stream.try_clone() ?

3. О, конечно, имеет смысл, спасибо @Plecra! Я тоже прочитаю главу.

Ответ №1:

Одним из исправлений является выполнение проверки ошибок в одном arm:

 async fn listen(self, listener: TcpListener) {
    let routes = self.routes;
    let mut incoming = listener.incoming();
    while let Some(tcp_stream) = incoming.next() {
        match tcp_stream {
            Ok(s) => {
                handle_request(tcp_stream.unwrap(), amp;routes);
            }
            Err(e) => {
                if e.kind() == io::ErrorKind::WouldBlock {
                    continue;
                }
                panic!("Error");
            },
        };
    }
}