【问题标题】:Maintain a HashMap of TcpStreams in a loop在循环中维护一个 TcpStreams 的 HashMap
【发布时间】:2015-12-12 17:12:27
【问题描述】:

我正在编写一个使用分布式哈希表 (DHT) 将数据分发到各个节点的应用程序。插入数据时,我必须遍历所有数据并将各个部分写入不同的节点。我不想为每次写入打开一个新的TcpStream 对象,而是想维护一个流映射,我可以根据需要使用它来写入数据。我对 Rust 语言非常陌生,我遇到了生命周期问题,特别是错误

不能将“流”作为可变借用,因为它已经作为可变借用了

“流”的寿命不够长。

我确信有一种花哨的 Rust 方法可以做到这一点。我正在使用的代码如下。

let mut streams = HashMap::new();
...
//get socket address to send data too
loop {
    match streams.get(&socket_addr) {
        Some(stream) => {
             capnp::serialize::write_message(*stream, &msg_builder).unwrap();
        },
        None => {
             let mut stream = TcpStream::connect(socket_addr).unwrap();
             streams.insert(socket_addr, &mut stream);
             capnp::serialize::write_message(&mut stream, &msg_builder).unwrap();
        }
    }
}

【问题讨论】:

标签: rust


【解决方案1】:

您不能在HashMap 中插入对流的引用,因为流是在match 表达式末尾超出范围的局部变量。 HashMap 必须拥有该流。

实现这一点的最简单方法是使用HashMap 上的entry() 方法在第一次使用时打开流。

fn main() {
    let socket_addr = /* ... */;
    let mut streams = HashMap::new();
    let msg_builder = /* ... */;
    loop {
        let stream = streams.entry(&socket_addr).or_insert_with(|| {
            TcpStream::connect(socket_addr).unwrap()
        });
        capnp::serialize::write_message(stream, &msg_builder).unwrap();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 2011-05-02
    • 1970-01-01
    相关资源
    最近更新 更多