2016-12-08 13 views
4

​​(0.5.1)を使用してチャットサーバーを作成しています(this tutorial)。私はこれが私のmatchはすべてカバーしていないことを意味すべきであることを理解しますが非網羅的なパターンに関するエラーが発生するのはなぜですか?

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 

:私はエラーを取得し、それをコンパイルしようとする際に、

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(); 
      } 
     } 
    } 
} 

しかし:これで、私は次のハンドラを書かれています可能性のあるケースでは、私はそれがどのように真実かわかりません。

なぜこのエラーが発生し、どのように修正できますか?あなたが任意の他のトークンを取得することはできませんことを知っているながら、コンパイラが知らない

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

、および:ここでは

答えて

7

SERVER_TOKENはそうのは、試合を簡素化させ、Token(0)に等しい定数でありますtypeはToken(1)のような他の値を許可します。他のケースをカバーするケースを追加できます。ちょうどpanicです。私はそれがデバッグの助けとして起こった場合にマッチしたものをプリントアウトするのが好きです。

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

これはTokenDebugを実装していることを前提としています。

+0

ないあなたは、コードの2番目のビットにやっていることを確認してください。 'x'とは何ですか?また、 'SERVER_TOKEN'マッチは単純なコロンで終わるのはなぜですか? –

+0

'x'は何でもマッチするダミーの名前です。私はコロンを見ることができません(カンマを意味しましたか?この例を短くするための質問には関係のないすべての処理を除外しました。 –

+0

ええ、私はコンマを書いていましたが、どうしてコロンを書いたのか分かりません。私はあなたが今何を意味するか、私を助けるために時間をとっていただきありがとうございます:) –

関連する問題