为什么我会收到有关非详尽模式的错误消息?

问题描述 投票:0回答:2

我正在使用 mio (0.5.1) 编写聊天服务器,遵循 this tutorial。有了它,我编写了以下处理程序:

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
没有涵盖所有可能的情况,但我不明白这是怎么回事。

为什么会出现此错误,我该如何解决?

rust pattern-matching
2个回答
14
投票

这里

SERVER_TOKEN
是一个等于
Token(0)
的常数,所以让我们简化匹配:

match token {
    Token(0) => { },
}

虽然 you 知道您不会得到任何其他标记,但编译器不知道,并且该类型允许其他值,如

Token(1)
。您可以添加一个案例来覆盖其他案例,只需
panic
。我喜欢打印出匹配的内容作为调试辅助工具。

match token {
    SERVER_TOKEN => { },
    x => panic!("Unexpected invalid token {:?}", x),
}

这假设

Token
实现
Debug
.


0
投票

pattern ... not covered
当未提供默认选项时,
match
语句出现错误。

包括

Token(_):"default option"

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();
    },
    Token(_):"default option do something"
}
© www.soinside.com 2019 - 2024. All rights reserved.