我在mio之后使用this tutorial(0.5.1)编写聊天服务器。有了它,我写了以下处理程序:
const SERVER_TOKEN: Token = Token(0);
impl Handler for WebSocketServer {
type Timeout = usize;
type Message = ();
fn ready(&mut self, event_loop: &mut EventLoop<WebSocketServer>,
token: Token, events: EventSet)
{
match token {
SERVER_TOKEN => {
let client_socket = match self.socket.accept() {
Err(e) => {
println!("Accept error: {}", e);
return;
},
Ok(None) => unreachable!("Accept has returned 'None'"),
Ok(Some((sock, addr))) => sock,
};
self.token_counter += 1;
let new_token = Token(self.token_counter);
self.clients.insert(new_token, client_socket);
event_loop.register(&self.clients[&new_token],
new_token, EventSet::readable(),
PollOpt::edge() | PollOpt::oneshot()).unwrap();
}
}
}
}
然而,在尝试编译时,我收到一个错误:
error[E0004]: non-exhaustive patterns: `Token(_)` not covered
--> src/main.rs:23:15
|
23 | match token {
| ^^^^^ pattern `Token(_)` not covered
error: aborting due to previous error
虽然我明白这应该意味着我的match
并未涵盖所有可能的情况,但我不明白这是怎么回事。
为什么我会收到此错误,我该如何解决?
答案 0 :(得分:8)
此处SERVER_TOKEN
是一个等于Token(0)
的常量,所以让我们简化匹配:
match token {
Token(0) => { },
}
当你知道你不会得到任何其他令牌时,编译器不知道,并且该类型允许其他值,如Token(1)
。您可以添加案例以涵盖其他案例,只需添加panic
。如果它确实作为调试辅助工具发生,我喜欢打印出匹配的内容。
match token {
SERVER_TOKEN => { },
x => panic!("Unexpected invalid token {:?}", x),
}
这假设Token
实现了Debug
。