繁体   English   中英

Rust 所有权问题

[英]Rust ownership issues

I'm quite new to Rust, I'm mainly a C#, javascript and python developer, so I like to approach things in a OOP way, however I still can't wrap my head around ownership in rust. 尤其是涉及到 OOP 时。

我正在写一个 TCP 服务器。 我有一个包含连接(流)的结构,我使用 mio crate 异步读取了 sockets。 我明白错误告诉我什么,但我不知道如何解决它。 我尝试将 read_message 方法更改为 function(不引用 self),这有效,但问题是我需要从结构访问连接和诸如此类的东西(例如,在 sockets 之间中继消息),所以这个解决方法在以后的版本中是不合理的。 有没有简单的解决方法,还是设计本身就有缺陷?

这是一个片段,显示了我的问题:

let sock = self.connections.get_mut(&token).unwrap();
loop {
    match sock.read(&mut msg_type) {
        Ok(_) => {
            self.read_message(msg_type[0], token);
        }
    }
}

fn read_message(&mut self, msg_type: u8, token: Token) {
    let sock = self.connections.get_mut(&token).unwrap();
    let msg_type = num::FromPrimitive::from_u8(msg_type);
    match msg_type {
        Some(MsgType::RequestIps) => {
            let decoded: MsgTypes::Announce = bincode::deserialize_from(sock).unwrap();
            println!("Public Key: {}", decoded.public_key);
        }
        _ => unreachable!()
    } 
}

我得到的错误如下: 在此处输入图像描述

在您尝试调用self.read_message的那一刻,您在sock上持有一个可变借用,这是self的一部分。 由于您指出read_message需要对所有self进行可变访问,因此您需要确保此时不再有可变借用sock

幸运的是,由于 Rust 2018 中的非词汇生命周期,这并不难做到; 只需在循环内获取sock

loop {
    let sock = self.connections.get_mut(&token).unwrap();
    match sock.read(&mut msg_type) {
        Ok(_) => {
            self.read_message(msg_type[0], token);
        }
    }
}

假设sock.read不返回任何持有sock借用的东西,这应该让sock上的可变借用在调用self.read_message之前被释放。 它需要在下一次迭代中重新获取,但是当您正在执行网络 I/O 时,单个HashMap (?) 访问的相对性能损失应该可以忽略不计。

(由于缺少最小的可编译示例,我无法对此进行测试。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM