[英]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.