簡體   English   中英

在模式匹配上動態轉換類型

[英]Dynamically cast types on pattern matching

假設:

pub fn handle_connection(&mut data: impl NetworkStream) {...}

其中NetworkStream

pub trait NetworkStream

因此,我想在handle_connection中編寫一些對調度HttpServerUdpServerWebsocketServer自定義類型有效的通用代碼。 這個想法是, handle_connection的調用者可以傳遞任何實現了某些特征的類型(例如 NetworkStream),為這些類型實現,並且handle_connection將能夠在不知道傳入的具體類型的情況下識別、實例化和調用正確的類型。

但是,這里的主要問題是,在 Rust 中,這段代碼如何能夠使用impl NetworkStream參數並將其轉換為具體代碼?

請注意,我要求根據某些條件進行類型轉換的慣用方法,例如 Java is instance of ,或者即使它與類型檢查和轉換完全不同,也需要正確的方法來執行這種邏輯。

您無法在handle_connection內部區分它實際上是哪種類型。 您必須將任何特定於類型的代碼移動到特征的特定於類型的實現中。

另外,次要的 nitpick: &mut data: impl NetworkStream是一個奇怪的簽名,它可能應該是data: &mut impl Networkstream

這就是這種架構的樣子。 當然,所有類型都是虛擬模擬,應該用實際類型替換。 這只是為了展示它的樣子:

struct HttpServer {}
struct UdpServer {}
struct WebsocketServer {}

trait NetworkStream {
    fn receive_message(&mut self) -> String;
}

impl NetworkStream for HttpServer {
    fn receive_message(&mut self) -> String {
        "HttpMessage!".to_string()
    }
}
impl NetworkStream for UdpServer {
    fn receive_message(&mut self) -> String {
        "UdpMessage!".to_string()
    }
}
impl NetworkStream for WebsocketServer {
    fn receive_message(&mut self) -> String {
        "WebsocketMessage!".to_string()
    }
}

fn handle_connection(data: &mut impl NetworkStream) {
    let message = data.receive_message();
    println!("Received: {:?}", message);
}

fn main() {
    let mut http_server = HttpServer {};
    let mut udp_server = UdpServer {};
    let mut websocket_server = WebsocketServer {};
    handle_connection(&mut http_server);
    handle_connection(&mut udp_server);
    handle_connection(&mut websocket_server);
}
Received: "HttpMessage!"
Received: "UdpMessage!"
Received: "WebsocketMessage!"

要回答您問題的第二部分,使用std::any::Any進行動態向下轉換 但除非絕對必要,否則我會嘗試找到不需要Any的代碼結構。

通常,有一些方法可以靜態解析類型,例如使用訪問者模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM