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`.