2016-12-08 49 views
4

我正在使用​​(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並不包括所有可能的情況下,我不明白這是如此。

爲什麼我得到這個錯誤,我該如何解決?

回答

7

這裏SERVER_TOKEN爲常數等於Token(0),所以我們簡化了比賽:

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

雖然知道,你不會得到任何其他標記,編譯器不知道,和鍵入允許其他值如Token(1)。您可以添加一個案例來覆蓋其他案例,只需要panic。如果它發生作爲調試幫助,我喜歡打印出匹配的內容。

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

這假定Token實現Debug

+0

不知道你在做什麼,你的第二位代碼。什麼是'x'?另外,爲什麼'SERVER_TOKEN'匹配在一個簡單的冒號中結束? –

+0

'x'只是一個虛擬的名字,可以與任何東西相匹配。我看不到冒號(你的意思是逗號?);我忽略了與問題無關的所有處理,以縮短範例。 –

+0

是的,我的意思是逗號,不知道爲什麼我寫冒號。我明白你的意思了,謝謝你花時間幫助我:) –

相關問題