Rust:错误:无法借用`&;的不可变取消引用`-指针“*strm”是可变的

Rust:错误:无法借用`&;的不可变取消引用`-指针“*strm”是可变的,rust,borrow-checker,Rust,Borrow Checker,我又碰到了借钱的人 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 = l

我又碰到了借钱的人

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

我的错误是什么?

retain
中传递给谓词的参数从来都不是可变的,但是
peer\u name()
只能在可变对象上调用

不确定最好的解决方案是什么


建议:HashMap。@谢谢,我刚才正在看
树集
文档(带有
)。
HashMap
/
HashSet
更合适吗?@ChrisMorgan解释道,别担心。我已经查找了
HashMap
,但是由于某种原因我没有找到它(因此
TreeMap
/
TreeSet
)(直到一分钟前我尝试了站点搜索)。
   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`.