簡體   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