networking - Rust 所有权问题
问题描述
我对 Rust 很陌生,我主要是 C#、javascript 和 python 开发人员,所以我喜欢以 OOP 方式处理事情,但是我仍然无法理解 rust 的所有权。尤其是在涉及 OOP 时。
我正在编写一个 TCP 服务器。我有一个包含连接(流)的结构,我使用 mio crate 异步读取套接字。我明白错误告诉我什么,但我不知道如何解决它。我尝试将 read_message 方法更改为一个函数(没有对 self 的引用),它起作用了,但问题是我需要从结构访问连接和诸如此类的东西(例如,在套接字之间中继消息),所以这个解决方法在以后的版本中是不合理的。有没有简单的解决方法,还是设计本身就有缺陷?
这是一个片段,显示了我的问题:
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!()
}
}
解决方案
在您尝试跟注的那一刻,您持有一个可变借位sock
,这是其中的一部分。由于您表示需要对所有 进行可变访问,因此您需要确保此时不再有可变借用。self
self.read_message
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
(?) 访问的相对性能损失应该可以忽略不计。
(由于缺少最小的可编译示例,我无法对此进行测试。)
推荐阅读
- c++ - Visual C:模板类中的自定义错误消息
- haskell - 为什么在代数数据类型中可以将乘积之和视为范式?
- c# - 用户控件中的自定义依赖属性不绑定
- r - 如何从列中提取变量
- angular - 如何将对象从服务传递到Angular8中的组件?
- apache-spark - 如何调试为什么挂起阶段处于未知状态?
- c# - 如何避免每次测试重复的 TestFixtures 安排?
- wpf - 如何将 1 个日历控件绑定到另一个日历控件?例如,如果我在 1 个日历中进行了更改,它将反映在 wpf 中的另一个日历中
- python - ctypes 对函数中可变参数的奇怪处理
- javascript - 如何使用 ng-model 用值预填充文本框