Error: the type of this value must be known in this context

I am writing a simple TCP chat engine to learn Rust.

use std::io::{TcpListener, TcpStream}; use std::io::{Acceptor, Listener}; enum StreamOrSlice { Strm(TcpStream), Slc(uint, [u8, ..1024]) } fn main() { let listener = TcpListener::bind("127.0.0.1", 5555); // bind the listener to the specified address let mut acceptor = listener.listen(); let (tx, rx) = channel(); spawn(proc() { let mut streams: Vec<TcpStream> = Vec::new(); match rx.recv() { Strm(mut stream) => { streams.push(stream); } Slc(len, buf) => { for stream in streams.iter() { stream.write(buf.slice(0, len)); } } } }); // accept connections and process them, spawning a new tasks for each one for stream in acceptor.incoming() { match stream { Err(e) => { /* connection failed */ } Ok(mut stream) => { // connection succeeded tx.send(Strm(stream.clone())); let tx2 = tx.clone(); spawn(proc() { let mut buf: [u8, ..1024] = [0, ..1024]; loop { let len = stream.read(buf); tx2.send(Slc(len.unwrap(), buf)); } }) } } } } 

The above code does not compile with:

  Compiling chat v0.1.0 (file:///home/chris/rust/chat) src/chat.rs:20:13: 20:29 error: the type of this value must be known in this context src/chat.rs:20 Strm(mut stream) => { ^~~~~~~~~~~~~~~~ error: aborting due to previous error Could not compile `chat`. 

What is the reason for this?

The value type is known; it is declared in enum as TcpStream .

How can I fix this code?

+6
source share
2 answers

The problem is that when you try to match with rx.recv() compiler does not know the type of this expression, as you stated, using the generic

 let (tx, rx) = channel(); 

and he still had no opportunity to deduce the general type.

In addition, since it must verify that templates are correctly covered, it cannot use a template to type inference. Therefore, you need to explicitly declare this, for example:

 let (tx, rx) = channel::<StreamOrSlice>(); 
+8
source

This is fixed by changing:

  match rx.recv() { 

in

  let rxd: StreamOrSlice = rx.recv(); match rxd { 

It seems like this is just a rejection of type inference.

+1
source

Source: https://habr.com/ru/post/976452/


All Articles