Rust 所有权问题
Rust ownership issues
我对 Rust 很陌生,我主要是 C#,javascript 和 python 开发人员,所以我喜欢以 OOP 方式处理事情,但我仍然不能把我的头缠在生锈的所有权上。尤其是涉及到 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!()
}
}
我得到的错误如下:
在您尝试调用 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
没有 return 任何在 sock
上持有借用的东西,这应该让 sock
上的可变借用在调用 [=13 之前被释放=].它需要在下一次迭代中重新获取,但是看到你正在做网络 I/O,单个 HashMap
(?) 访问的相对性能损失应该可以忽略不计。
(由于缺少可编译的最小示例,我无法对此进行测试。)
我对 Rust 很陌生,我主要是 C#,javascript 和 python 开发人员,所以我喜欢以 OOP 方式处理事情,但我仍然不能把我的头缠在生锈的所有权上。尤其是涉及到 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!()
}
}
我得到的错误如下:
在您尝试调用 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
没有 return 任何在 sock
上持有借用的东西,这应该让 sock
上的可变借用在调用 [=13 之前被释放=].它需要在下一次迭代中重新获取,但是看到你正在做网络 I/O,单个 HashMap
(?) 访问的相对性能损失应该可以忽略不计。
(由于缺少可编译的最小示例,我无法对此进行测试。)