#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");
},
};
}
}