서버

2014-10-08 2 views
0

에게이 코드를 에코 :서버

use std::io::{TcpListener, TcpStream}; 
use std::io::{Acceptor, Listener}; 

fn main() { 
    let listener = TcpListener::bind("127.0.0.1", 5555); 

    // bind the listener to the specified address 
    let mut acceptor = listener.listen(); 

    // accept connections and process them, spawning a new tasks for each one 
    for stream in acceptor.incoming() { 
     match stream { 
      Err(e) => { /* connection failed */ } 
      Ok(stream) => { 
       // connection succeeded 
       spawn(proc() { 
        let mut buf: [u8, ..1024] = [0, ..1024]; 
        loop { 
         let len = stream.read(buf); 
         let _ = stream.write(buf.slice(0, len.unwrap())); 
        } 
       }) 
      } 
     } 
    } 
} 

는 실패 :

Compiling chat v0.1.0 (file:///home/chris/rust/chat) 
src/chat.rs:19:35: 19:41 error: cannot borrow immutable captured outer variable in a proc `stream` as mutable 
src/chat.rs:19       let len = stream.read(buf); 
               ^~~~~~ 
src/chat.rs:20:25: 20:31 error: cannot borrow immutable captured outer variable in a proc `stream` as mutable 
src/chat.rs:20       stream.write(buf.slice(0, len.unwrap())); 
             ^~~~~~ 
error: aborting due to 2 previous errors 
Could not compile `chat`. 

하지만에 코드를 변경하는 경우 :

   spawn(proc() { 
        fn handle(mut stream: TcpStream) { 
         let mut buf: [u8, ..1024] = [0, ..1024]; 
         loop { 
          let len = stream.read(buf); 
          let _ = stream.write(buf.slice(0, len.unwrap())); 
         } 
        } 
        handle(stream); 
       }) 

그것은 작동합니다.

handle 기능을 제거 할 수있는 방법이 있습니까?

+0

변경'확인 (스트림)'으로는 가변 선언하는 것을 금지합니다. – Levans

+0

고마워요 @ Levans -이 대답을하고 받아 들일 것입니다. – fadedbee

답변

1

코드의 까다로운 부분이 사용자의 패턴입니다. 당신이 뭔가를 쓸 때 :

match foo.bar() { 
    Some(value) => { ... }, 
    _ => {} 
} 

당신은 (내 예 value) 새로운 변수를 선언하고 그것으로 옵션의 내용을 이동합니다. 그것은 실제적으로 동등 물 : 그래서이 상황에서

let value = foo.bar().unwrap(); 

, 아무것도 '확인 (MUT 스트림)`에

match foo.bar() { 
    Some(mut value) => { ... }, 
    _ => {} 
}