【发布时间】:2014-10-09 12:06:24
【问题描述】:
我又遇到了借用检查器...
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`.
我的错误是什么?
【问题讨论】:
-
建议:HashMap
. -
@ChrisMorgan 谢谢,我只是在查看
TreeSet文档(带有<SocketAddr, TcpStream>)。HashMap/HashSet更合适吗? -
@ChrisMorgan 别担心,doc.rust-lang.org/std/collections 解释了一切。我一直在寻找
HashMap,但由于某种原因我找不到它(因此TreeMap/TreeSet)(直到我在一分钟前尝试了站点搜索)。
标签: rust borrow-checker