2014-10-09 4 views
2

Я подбежал против заема проверку снова ...Rust: ошибка: не может занимать непреложное разыменование `&` `-указатель * strm` в изменяемом

enum TcpOrStr { 
    AddTcp(TcpStream), 
    RmTcp(SocketAddr), 
    Str(String, SocketAddr) 
} 

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(); 
     loop { 
      let rxd: TcpOrStr = rx.recv(); 
      match rxd { 
       AddTcp(stream) => { 
        streams.push(stream); 
       } 
       RmTcp(src) => { 
        // FIXME: O(n) operation 
        streams.retain(|mut strm|{ return strm.peer_name().unwrap() != src}); 
       } 
       Str(line, src) => { 
        for stream in streams.iter_mut() { 
         if stream.peer_name().unwrap() == src { 
          continue; 
         } 
         let mut line_vec = line.clone().into_bytes(); 
         let _ = stream.write(line_vec.as_mut_slice()); 
        } 
       } 
      } 
     } 
    }); 

Ошибка:

Compiling chat v0.1.0 (file:///home/chris/rust/chat) 
src/chat.rs:29:55: 29:59 error: cannot borrow immutable dereference of `&`-pointer `*strm` as mutable 
src/chat.rs:29      streams.retain(|mut strm|{ return strm.peer_name().unwrap() != src}); 
                    ^~~~ 
error: aborting due to previous error 
Could not compile `chat`. 

Какая у меня ошибка?

+1

Предложение: HashMap . –

+0

@ChrisMorgan Спасибо, я просто смотрел документы 'TreeSet' (с' '). Является ли 'HashMap' /' HashSet' более подходящим? – fadedbee

+0

@ChrisMorgan Не беспокойтесь, http://doc.rust-lang.org/std/collections/ объясняет все это. Я искал «HashMap», но мне почему-то не удалось найти его (следовательно, «TreeMap' /' TreeSet') (пока я не попробовал поиск по сайту минуту назад). – fadedbee

ответ