【问题标题】:Rust: error: cannot borrow immutable dereference of `&`-pointer `*strm` as mutableRust:错误:不能借用 `&`-pointer `*strm` 的不可变解引用为可变
【发布时间】: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 文档(带有&lt;SocketAddr, TcpStream&gt;)。 HashMap/HashSet更合适吗?
  • @ChrisMorgan 别担心,doc.rust-lang.org/std/collections 解释了一切。我一直在寻找HashMap,但由于某种原因我找不到它(因此TreeMap/TreeSet)(直到我在一分钟前尝试了站点搜索)。

标签: rust borrow-checker


【解决方案1】:

传递给retain 中谓词的参数永远不会可变,但peer_name() 只能在可变对象上调用。

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

http://doc.rust-lang.org/std/io/net/tcp/struct.TcpStream.html#method.peer_name

http://doc.rust-lang.org/std/vec/struct.Vec.html#method.retain

【讨论】:

    猜你喜欢
    • 2016-07-30
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    相关资源
    最近更新 更多