Rust中用元組模式匹配替代if-else
在當前專案(多人遊戲伺服器)中遇到的常見情況如下:
- 1)執行多個返回 Result<T, String> 的函式。
- 2a) 如果他們都成功了,繼續走快樂的道路
- 2b) 如果他們中的任何一個失敗了,用他們的第一個錯誤執行一個錯誤場景。
這也是程式設計中的一個普遍問題:同時從多個表示式分支。
最初的解決方案是做一堆巢狀檢查:
if let Ok(response1) = func1() { if let Ok(response2) = func2() { if let Ok(response3) = func3() { handleResponse(response1, response2, response3) } else if let Err(e) { handleError(e) } } else if let Err(e) { handleError(e) } } else if let Err(e) { handleError(e) } |
嘗試透過使用元組來簡化它:
match (func1(), func2(), func3()) { (Ok(r1), Ok(r2), Ok(r3)) => handleResponse(r1, r2, r3), (Err(e), _, _) | (_, Err(e), _) | (_, _, Err(e) => handleError(e) } |
注意e來自 3 個不同的變數,在三種不同的匹配情況下。
但是隻要每個案例之間的 Err 型別相同,Rust 就允許我們在單個表示式中使用不同的變數。
如果我們不關心錯誤響應,當然我們可以進一步簡化:
match (func1(), func2(), func3()) { (Ok(r1), Ok(r2), Ok(r3)) => handleResponse(r1, r2, r3), _ => handleError() } |
Rustaceans為這種模式提供了一些很酷的變體。使用? 內聯閉包的語法,我們可以進一步簡化:
match (|| Ok(func1()?, func2()?, func3()?))() { Ok((r1, r2, r3)) => handleResponse(r1, r2, r3), Err(e) => handleError(e), } |
雖然閉包語法有點不清楚,但這種風格的一個優點是,如果第一個函式返回一個錯誤變數,第二個和第三個函式甚至都不會被執行。我們還可以使用離散函式而不是閉包來增加清晰度:
fn calc() -> Result<(R1, R2, R3), E> { let r1 = func1()?; let r2 = func2()?; let r3 = func3()?; Ok((r1, r2, r3)) } match calc() { Ok(r) => handle_response(r), Err(e) => handle_error(e), } |
另一個變體是and_then :
let result = func1() .and_then(|r1| func2().map(|r2| (r1, r2))) .and_then(|(r1, r2)| func3().map(|r3| (r1, r2, r3))); match result { Ok(r) => handle_response(r), Err(e) => handle_error(e), } |
更多ifelse
相關文章
- Rust -- 模式與匹配Rust模式
- 在Java中用規則引擎模式替代ifelse - VitaliJava模式
- Rust語言之GoF設計模式:Flyweight享元模式RustGo設計模式
- 【設計模式】如何用組合替代繼承設計模式繼承
- Rust中用ntex快速實現http代理RustHTTP
- 《設計模式四》觀察、組合、享元模式設計模式
- C# 模式匹配C#模式
- if-else if-else 的用法
- 用Rust替代Java重寫DNS解析器RustJavaDNS
- 聊聊 scala 的模式匹配模式
- Swift中的模式匹配Swift模式
- 字串匹配模式問題字串匹配模式
- Scala模式匹配詳解模式
- Glob Patterns匹配模式使用模式
- rust 模組組織結構Rust
- Pingora:替代Nginx、Rust編寫的HTTP伺服器GoNginxRustHTTP伺服器
- MVC模式的替代者ADRMVC模式
- Verilog RTL優化策略(一):推薦使用assign語法替代if-else和case語法優化
- scala模式匹配詳細解析模式
- KMP字串模式匹配詳解KMP字串模式
- PostgreSQL:模式匹配操作符SQL模式
- 設計模式 | Spring中用到的設計模式,你知道幾個?設計模式Spring
- KMP模式匹配演算法KMP模式演算法
- 正規表示式支配匹配模式模式
- 一起學Scala 模式匹配模式
- [JS高程] 字串模式匹配方法JS字串模式
- 正則匹配的捕獲組
- Rust實現單例模式Rust單例模式
- 元組
- Rust編寫的Memcached快取替代品:memc.rsRust快取
- rust模組管理示例1Rust
- Rust語言之GoF設計模式: 模板方法模式RustGo設計模式
- Rust語言之GoF設計模式:原型模式RustGo設計模式原型
- Rust語言之GoF設計模式:迭代器模式RustGo設計模式
- Rust語言之GoF設計模式:工廠模式RustGo設計模式
- [譯] Swift 中強大的模式匹配Swift模式
- AC 自動機——多模式串匹配模式
- 模式匹配kmp演算法(c++)模式KMP演算法C++