我对Rust还是很陌生,主要是C#,javascript和python开发人员,因此我喜欢以OOP方式进行处理,但是我仍然无法将所有权归于rust。特别是在面向对象方面。
我正在写一个TCP服务器。我有一个包含连接(流)的结构,我使用mio条板箱异步读取了套接字。我知道错误告诉我什么,但我不知道如何解决。我尝试将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
(?)访问的相对性能损失应该可以忽略不计。(由于缺少最小的,可编译的示例,因此我无法对此进行测试。)
关于networking - rust 迹所有权问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65957980/