[英]Dynamically cast types on pattern matching
假設:
pub fn handle_connection(&mut data: impl NetworkStream) {...}
其中NetworkStream
:
pub trait NetworkStream
因此,我想在handle_connection
中編寫一些對調度HttpServer
、 UdpServer
或WebsocketServer
自定義類型有效的通用代碼。 這個想法是, 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.